Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程

news2024/11/19 12:40:23

1. 文件编程概述(399.1)

  • 内容超多:
    • 文件系统原理及访问机制
    • 文件在内核中的管理机制
    • 什么是文件信息节点inode
    • 文件的共享
    • 文件权限,各种用户对其权限
    • 。。。。。。
  • 应用为王,如:
    • 账单
    • 游戏进度
    • 配置文件等
  • 关心如何用代码操作文件,实现文件创建、打开、编辑等自动化执行
  • Windows 如何手动修改文件,比如写一个 word 文档:
    • 打开/创建文档、编辑文档、保存文档、关闭文档
  • 计算机如何帮助我们自动化完成以上操作?
  • 操作系统提供了一系列的 API,如 Linux 系统:
    • 打开 open
    • 读写 write /read
    • 光标定位 lseek
    • 关闭 close

2. 文件打开及创建(400.2)

打开/创建文件

在这里插入图片描述
在这里插入图片描述

参数说明

在这里插入图片描述

  • int 返回值:文件描述符,应为小的非负整数
  • Pathname:要打开的文件名(含路径,缺省为当前路径)
  • Flags:
    • O_RDONLY 只读打开
    • O_WRONLY 只写打开
    • O_RDWR 可读可写打开
      • 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
      • 以上这三个常数中应当指定一个。
    • 下列常数是可选择的:
      • O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数 mode(0600),用其说明该新文件的存取许可权限
      • O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错
      • O_APPEND:每次写时都加到文件的尾端
      • O_TRUNC:属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为 0。
  • Mode:一定是在 flags 中使用了 O_CREAT 标志,mode 记录待创建的文件的访问权限
  • FILE/demo.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
int main(){
	int fd;//文件描述符,索引值

	fd = open("./file1",O_RDWR);//文件名(含路径),可读可写权限

	printf("fd = %d\n",fd);

	return 0;
}

在这里插入图片描述

  • FILE/demo2.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件

int main(){
	int fd;
	
	fd = open("./file1",O_RDWR);
	printf("fd = %d\n",fd);

	if(fd == -1){
		printf("open file1 failed\n");
		fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建
		if(fd > 0){
			printf("fd = %d\n",fd);
			printf("create file1 success!\n");
		}
	}

	return 0;
}

在这里插入图片描述
在这里插入图片描述

  • -rwx:
    • -:普通文件
    • r:可读
    • w:可写
    • x:可执行
      在这里插入图片描述

3. 文件写入操作编程(401.3)

  • 查看函数原型
    在这里插入图片描述

写入文件

在这里插入图片描述

  • write 返回的是写入的字节数
  • FILE/demo3.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件

int main(){
	int fd;
	char *buf = "Jessie is very kind.";
	
	fd = open("./file1",O_RDWR);
	printf("fd = %d\n",fd);

	if(fd == -1){
		printf("open file1 failed\n");
		fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建
		if(fd > 0){
			printf("fd = %d\n",fd);
			printf("create file1 success!\n");
		}
	}
	printf("open success : fd = %d\n",fd);//打开文件
	
	//ssize_t write(int fd, const void *buf, size_t count);//write的函数原型
	write(fd,buf,strlen(buf));//写入文件//在Linux中指针是固定8个字节,所以不能用sizeof
	//stlen计算字符串长度
	close(fd);//关闭文件
	
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 文件读取操作(402.4)

读取文件

在这里插入图片描述

  • read 返回的是读取的字节数
    在这里插入图片描述
  • FILE/demo4.c
  • FILE/demo5.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	char *buf = "Jessie is very kind.";
	
	fd = open("./file1",O_RDWR);
	printf("fd = %d\n",fd);

	if(fd == -1){
		printf("open file1 failed\n");
		fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建
		if(fd > 0){
			printf("fd = %d\n",fd);
			printf("create file1 success!\n");
		}
	}
	printf("open success : fd = %d\n",fd);//打开文件
	
	//ssize_t write(int fd, const void *buf, size_t count);
	int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数
	if(n_write != -1){
		printf("write %d byte to file1\n",n_write);
	}
	
	close(fd);
	fd = open("./file1",O_RDWR);//重新打开文件,光标移至头
	
	char *readBuf;
	readBuf = (char *)malloc(sizeof(char)*n_write + 1);	
	//ssize_t read(int fd, void *buf, size_t count);//read的函数原型
	int n_read = read(fd,readBuf,n_write);//存储从fd中读出的readBuf的所有的字节数
	
	printf("read %d ,context:%s\n",n_read,readBuf);
	close(fd);//关闭文件
	
	return 0;
}

5. 文件光标移动操作(403.5)

将文件读写指针相对whence移动offset个字节

在这里插入图片描述
在这里插入图片描述

  • FILE/demo6.c(打开、写入、定位光标、读取数据)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	char *buf = "Jessie is very kind.";
	
	fd = open("./file1",O_RDWR);
	printf("fd = %d\n",fd);

	if(fd == -1){
		printf("open file1 failed\n");
		fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建
		if(fd > 0){
			printf("fd = %d\n",fd);
			printf("create file1 success!\n");
		}
	}
	printf("open success : fd = %d\n",fd);//打开文件
	
	//ssize_t write(int fd, const void *buf, size_t count);//write的函数原型
	int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数
	if(n_write != -1){
		printf("write %d byte to file1\n",n_write);
	}
	
	//close(fd);
	//fd = open("./file1",O_RDWR);//重新打开文件,光标移至头
	
	char *readBuf;
	readBuf = (char *)malloc(sizeof(char)*n_write + 1);	
	//ssize_t read(int fd, void *buf, size_t count);//read的函数原型
	//off_t lseek(int fd, off_t offset, int whence);//lseek的函数原型
	//lseek(fd,0,SEEK_SET);
	lseek(fd,-20,SEEK_CUR);
	//lseek(fd,-20,SEEK_END);
	int n_read = read(fd,readBuf,n_write);//存储从fd中读出的readBuf的所有的字节数
	
	printf("read %d ,context:%s\n",n_read,readBuf);
	close(fd);//关闭文件
	
	return 0;
}

  • FILE/demo7.c(lseek返回有多少个字节)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	char *buf = "Jessie is very kind.";
	
	fd = open("./file1",O_RDWR);
	
	int filesize = lseek(fd,0,SEEK_END);//lseek返回多少个字节
	printf("file's size is :%d\n",filesize);
	
	close(fd);//关闭文件
	
	return 0;
}

关闭文件

在这里插入图片描述

6. 文件打开创建的补充(404.6)

O_EXCL:如果同时指定了 OCREAT,而文件已经存在,则出错(即返回-1)

  • FILE/demo8.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(){
        int fd;

        fd = open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);//若文件不存在则创建,已存在则出错
        if(fd == -1){
                printf("File1 exists.\n");
        }
        return 0;
}

O_APPEND:每次写时都加到文件的尾端(另起一行)

  • FILE/demo9.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	char *buf = "Jessie is very kind.";
	
	//fd = open("./file1",O_RDWR);
	fd = open("./file1",O_RDWR|O_APPEND);//另起一行添加字符

	printf("open success : fd = %d\n",fd);//打开文件

	int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数
	if(n_write != -1){
		printf("write %d byte to file1\n",n_write);
	}
	
	close(fd);//关闭文件
	
	return 0;
}

  • 有 O_APPEND 时:另起一行添加
    在这里插入图片描述
  • 无 O_APPEND 时:覆盖原先对应位置的字符,保留后边的字符
    在这里插入图片描述

O_TRUNC:去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0(即删除原来的所有字符)

  • FILE/demo10.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	char *buf = "Jessie.";
	
	fd = open("./file1",O_RDWR|O_TRUNC);//打开已有文件时,清空字符

	printf("open success : fd = %d\n",fd);//打开文件

	int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数
	if(n_write != -1){
		printf("write %d byte to file1\n",n_write);
	}
	
	close(fd);//关闭文件
	
	return 0;
}

在这里插入图片描述

创建文件creat函数

在这里插入图片描述

  • FILE/demo11.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件

int main(){
	int fd;
	
	//int creat(const char *pathname, mode_t mode);
	fd = creat("./file2",S_IRWXU);
	
	return 0;
}

在这里插入图片描述

7. 文件操作原理简述(审核不过./7)

文件描述符

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • FILE/demo12.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(){
	int fd;

	char readBuf[128];


	int n_read = read(0,readBuf,5);//从标准输入(键盘)读

	int n_write = write(1,readBuf,strlen(readBuf));//写到标准输出(UNIX shell)
	
	printf("\ndone!\n");
	
	return 0;
}

文件编程的一般步骤

  • 打开/创建文件、读取文件/写入文件、关闭文件
    在这里插入图片描述

在这里插入图片描述

Linux文件管理简述

在这里插入图片描述

8. 文件操作小应用之实现cp指令(405.8)

在这里插入图片描述

  • FILE/test1.c(先做测试)
#include <stdio.h>

int main(int argc, char **argv){
	printf("totol params: %d\n",argc);//参数总数
	printf("No.1 params :%s\n",argv[0]);//参数名称,数组的形式//a.out
	printf("No.2 params :%s\n",argv[1]);//src
	printf("No.3 params :%s\n",argv[2]);//des()

	return 0;
}

在这里插入图片描述

  • FILE/demo13.c( 实现linux cp命令的代码)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv){
	int fdSrc;//源文件描述符
	int fdDes;//目标文件描述符

	char *readBuf=NULL;

	if(argc != 3){//对参数个数的判断
		printf("pararm error\n");
		exit(-1);
	}

	fdSrc = open(argv[1],O_RDWR);//打开源文件
	
	int size = lseek(fdSrc,0,SEEK_END);//算出源文件的字节大小
	readBuf=(char *)malloc(sizeof(char)*size + 8);//开辟比源文件多8个字节的大小
	
	lseek(fdSrc,0,SEEK_SET);//光标移至源文件内容的头
	int n_read = read(fdSrc, readBuf, size);//读源文件到readBuf,要用size
	
	fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//打开/创建目标文件,目标文件已存在时清空内容
	int n_write = write(fdDes,readBuf,strlen(readBuf));//将readBuf写入目标文件

	close(fdSrc);//关闭源文件
	close(fdDes);//关闭目标文件

	return 0;
}

在这里插入图片描述

9. 解决上节课中的隐藏bug(406.9)

  • FILE/demo13.c( 实现linux cp命令的代码)
int n_read = read(fdSrc, readBuf, size);//读源文件到readBuf,要用size
	
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//打开/创建目标文件,目标文件已存在时清空内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WEditor的安装和使用

WEditor 编辑器能够提供辅助编写脚本&#xff0c;查看组件信息&#xff0c;调试代码等功能。 Screenshot 安装 依赖项目 Python3.6 uiautomator2facebook-wda Only tested in Google Chrome, IE seems not working well. pip3 install -U weditor # uiautomator2, faceboo…

龙迅LT86102UXE HDMI2.0转二路HDMI2.0/1.4,支持音频剥离,支持4K60HZ

龙迅LT86102UXE 1.描述&#xff1a; 龙迅 LT86102UXE HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1&#xff1a;2 分路器、最大 6Gbps 高速 数据速率、自适应均衡 RX 输入和预加重 TX 输出&#xff08;用于支持长电缆应用&#xff09;、内部 TX 通道交换以 实现灵活的 PCB…

天眼查最新方式工商信息爬取(公开信息)

本章教程,主要介绍利用python效率提取天眼查公开工商信息。 官网地址:天眼查-商业查询平台_企业信息查询_公司查询_工商查询_企业信用信息系统 教程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 1、数据预览 2、程序代码 #!/usr/bin/python # -*- coding: UTF-…

vue3结合elemplent-plus组件初始化选择日期范围

实现的效果&#xff1a; 在使用时踩了个坑&#xff0c;耽搁了俩小时时间&#xff0c;气人&#xff01;&#xff01;&#xff01;&#xff01; 注意&#xff1a; 1.获取上个月时间时必须使用正确的时间格式去获取&#xff0c;在获取时间的时候不能操作-等 2.获取到的时间必须…

物联网AI MicroPython传感器学习 之 HX711称重传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 下图是一款量程为5kg的称重传感器&#xff0c;采用悬臂梁方式安装。传感器主体结构是一个开孔金属条&#xff0c;金属条上下表面各贴有两个应变电阻&#xff0c;当金属条受力发生变形时时&…

接口测试如何高效管理接口文档 !

痛点 如果你负责测试的项目是一个前后端分离的项目。 回忆下是不是有如下场景: 某个项目开发完成,接口文档发布在了 swagger 上,前后端各自进行开发。此时你负责这个项目的服务端测试。 首先进行接口测试,熟练的打开 postman 导入 swagger 文档,然后开始进行接口测试。 接口…

自动化办公篇之python

1、如果没有安装xlwings库&#xff0c;先在控制台pip install xlwings,然后点击运行&#xff0c;创建四个空excel表 。 import xlwings as xw app xw.App(visibleTrue,add_bookFalse) for dept in ["技术部","销售部","运营部","财务部&q…

2023年中国渔业研究报告

第一章 行业概况 1.1 定义 渔业&#xff0c;作为全球经济的重要支柱之一&#xff0c;其核心活动包括捕捞、水产养殖、产品加工与销售等。其不仅是食物安全的重要保障&#xff0c;还是许多沿海和内陆地区经济发展的重要动力。 首先&#xff0c;捕捞活动是渔业的基础。通过海洋…

中国走向碳中和:零碳联盟的关键角色

随着近期联合国大会上主席宣布的中国碳中和目标&#xff0c;国家的低碳转型和绿色可持续发展再次成为焦点。面对这样的国家大政方针&#xff0c;不少企业和机构纷纷响应&#xff0c;其中零碳联盟的努力与成果更是备受瞩目。 零碳联盟&#xff0c;作为中国投资协会联合多家机构…

微信小程序生成海报

效果: js1: const cloudHelper = require(../../../helper/cloud_helper.js);async function config1({cover,title,desc,qr,bg = }) {var qr1 ="images/qr.png"var qr2 ="https://636c-cloud1-0gu29f2j63906b7e-1319556650.tcb.qcloud.la/activitycomm/setu…

C++入门 —— 命名空间

命名空间 前言1. 什么是命名空间2. 命名空间的定义3. 命名空间的使用3.1 域作用限定符 ::3.2 使用using将命名空间中某个成员引入3.3 使用using namespace 命名空间名称 引入 4. cin/cout 输入输出4.1 C中的输入输入与C中的输入输出对比 所属专栏&#xff1a;C“嘎嘎" 系统…

快速自动化处理JavaScript渲染页面

在进行网络数据抓取时&#xff0c;许多网站使用了JavaScript来动态加载内容&#xff0c;这给传统的网络爬虫带来了一定的挑战。本文将介绍如何使用Selenium和ChromeDriver来实现自动化处理JavaScript渲染页面&#xff0c;并实现有效的数据抓取。 1、Selenium和ChromeDriver简介…

AN基础工具——动画人物上色

【AN基础工具——动画人物上色】 基本操作滴管工具填充工具画笔工具流畅画笔工具 实例&#xff0c;给多啦A梦上色注意事项 本篇内容&#xff1a;动画人物绘制基础 重点内容&#xff1a;滴管工具&#xff0c;画笔工具&#xff0c;填充工具 工 具&#xff1a;Adobe Animate 2022 …

17个开源的Go语言博客和CMS解决方案

Go语言&#xff0c;也称为Golang&#xff0c;是一种为构建高效、可靠和可扩展软件而设计的开源编程语言。它于2007年在Google开发&#xff0c;现在广泛用于开发Web应用程序、网络工具和系统软件。 为什么使用基于Go的CMS解决方案&#xff1f; 这些优势使Go成为开发可扩展、高…

鼠标划过改变子元素的属性 vue

鼠标划过改变子元素的属性 vue &#xff08;未完成&#xff09; 一、需求 我想做一个类似词句大爆炸的效果&#xff0c;将一个句子炸成多个词条&#xff0c;然后手动选择需要的内容。 结构是这样的 wordList -> word 需要的操作是鼠标左键划过的时候将划过的字词选中。 …

【Proteus仿真】【51单片机】水箱液位监控系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、液位传感器、PCF8591 ADC转换器、水泵等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前水位、上下限…

07 | @Entity 之间的关联关系注解如何正确使用?

实体与实体之间的关联关系一共分为四种&#xff0c;分别为 OneToOne、OneToMany、ManyToOne 和 ManyToMany&#xff1b;而实体之间的关联关系又分为双向的和单向的。实体之间的关联关系是在 JPA 使用中最容易发生问题的地方&#xff0c;接下来我将一一揭晓并解释。我们先看一下…

简单总结Centos7安装Tomcat10.0版本

文章目录 前言JDK8安装部署Tomcat 前言 注意jdk与tomcat的兼容问题&#xff0c;其他的只要正确操作一般问题不大 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomca…

鼠标右键展示“用Hbuilder“打开方法

桌面新建一个 文本文档&#xff0c;把下面这段粘贴进去 [Version] Signature"$Windows NT$" [DefaultInstall] AddRegHBuilderX [HBuilderX] hkcr,"*\\shell\\HBuilderX",,,"用 HBuilderX 打开" hkcr,"*\\shell\\HBuilderX\\command"…

“过度炒作”的大模型巨亏,Copilot每月收10刀,倒赔20刀

大模型无论是训练还是使用&#xff0c;都比较“烧钱”&#xff0c;只是其背后的成本究竟高到何处&#xff1f;已经推出大模型商用产品的公司到底有没有赚到钱&#xff1f;事实上&#xff0c;即使微软、亚马逊、Adobe 这些大厂&#xff0c;距离盈利之路还有很远&#xff01;同时…