目录
目录
一、打开创建文件
1、open函数原型
2.参数说明:
pathname:要打开的文件名(含路径)
flags : O_RDONLY 只读打开,O_WRONLY 只写打开,O_RDWR 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个参数中应当只指定一个。下列参数是可选择的:
O-CREAT :若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode.用其说明该新文件的存取许可权限。
O_EXCL :以这种属性去打开文件时,如果同时指定了O_CREAT,而文件已经存在,则打开文件失败。
O_APPEND :以这种属性去打开文件时,每次写时都加到文件的尾端,正常写入没有加其他条件的话,原来文件中的数据内容会被覆盖,没有覆盖的会保留。
O_TRUNC :以这种属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0,就是新数据替换旧数据。
Mode:一定是在flags中使用了 O-CREAT 标志,mode 记录待创建的文件的访问权限。
2.1、O-CREAT
2.1.1、打开一个已存在的文件
如上图:若打开一个已存在的文件,返回值是3,若打开一个不存在的文件,则返回值是-1。
2.1.2、打开一个不存在的文件
如上图:打开当前路径下一个文件,若文件不存在,则创建一个权限为0600的文件,这里0600是文件所有者一个可读可写的权限,即file1权限为可读可写。
2.2、O_EXCL
以这种属性去打开文件时,如果同时指定了O_CREAT,而文件已经存在,则打开文件失败。返回值为-1,正常打印出“file have been” ,O_EXCL就是检查文件是否存在。
2.3、O_APPEND
程序创建前,先创建一个文件file1,并在里面随便写入数据,运行此程序,发现文件file1里的数据尾端插入了“ganjiuwanle”。
2.4、O_TRUNC
程序创建前,先创建一个文件file1,并在里面随便写入数据,运行此程序,发现文件file1里的数据被替换成test。这就是O_TRUNC的作用。
2.5、creat函数
2.5.1、函数原型:
2.5.2、参数说明:
S_IRUSR 4 | 可读 |
S_IWUSR 2 | 可写 |
S_IXUSR 1 | 可执行 |
S_IRWXU 7 | 可读、写、执行 |
2.5.3、程序演示:
如上图:creat函数会在改目录下创建一个file1文件,文件的属性为可读可写可执行。
二、文件写入操作
1、函数原型
2、参数说明:
int fd :文件描述符
const void *buf :一个无类型的指针buf,是一个缓冲区
size_t count:你要写入文件的大小
返回值:如果成功,将返回写入的字节数 (0表示没有写入任何内容)。出现错误时,返回-1,并适当地设置errno
3、程序演示
![](https://img-blog.csdnimg.cn/direct/0742f6d6eb734c75aa97f99065b957ee.png)
三、文件读取操作:
1、函数原型:
2、参数说明:
int fd :文件描述符
const void *buf :一个无类型的指针buf,是一个缓冲区
size_t count:你要写入文件的大小
3、程序演示:
如上图:如果不在write后关闭文件,再重新打开,则光标就会停留在数据尾部,这样会造成数据无法读取,关闭文件后再打开,光标就会回到数据头部,数据就会成功读取。
四、lseek光标移动操作
1、函数原型:
2、参数说明:
int fd : | 文件描述符 |
off_t offset: | 偏移多少个字节 |
int whence: | 光标偏移位置 |
其中关于off_t offset的偏移方向:正值表示向前偏移(比如从当前位置向文件尾部方向偏移一定字节数),负值表示向后偏移(从当前位置向文件头部方向偏移一定字节数)。
SEEK_SET:光标偏移到头 SEEK_CUR:光标为当前位置 SEEK_END:光标偏移到末尾
lseek(fd,0,SEEK_SET) | 光标移动到头后,相对头偏移0个字节位置 |
lseek(fd,0,SEEK_END) | 常用于计算文件大小 |
lseek(fd,-8,SEEK_END) | 将光标移动到尾巴后,相对尾巴向头偏移8个字节 |
lseek(fd,-8,SEEK_CUR) | 光标移动到当前位置,相文件头部方向偏移8个字节 |
返回值:Iseek()返回从文件开始的偏移位置(以字节为单位)【就是返回偏移了多少个字节】。发生错误时,返回值(off_t) -1,并设置errno来指示错误。
2.1、SEEK_SET应用实例:
2.2、SEEK_CUR应用实例:
2.3、SEEK_END应用实例:
下图是利用lseek函数的返回值来计算文件大小。定义一个整形数filesize接收lseek的返回值,从而计算出文件的大小。
五、cp指令的实现
1、整体思路:
例如在linux中 cp test.c test1.c ,我们完成了test.c的文件复制。将其文件内容复制到test1.c。那如果我们不用cp指令如何实现复制。
- 首先打开或者创建一个我们要复制的那个文件 例如Src。
- 读取这个文件的数据,存储在数组Buf中。
- 打开或者创建一个复制后的文件 例如Des。
- 将读取到的数据写入到test1.c中。
- 最后关闭这两个文件。
2、程序演示:
2.1、创建程序:
2.2、命令的使用:
gcc demo12.c -o mycp 生成可执行文件mycp 相当于linux中的cp指令
./mycp test.c test1.c 运用mycp完成文件数据的复制。
即便要复制的文件中已存在数据,并且数据比源文件多,当我们调用了O_TRUNC,数据也能完美的复制过来。
六、文件修改和写入
1、strstr函数
1.1、函数原型:
1.2、参数说明:
- haystack – 要被检索的 C 字符串。
- needle – 在 haystack 字符串内要搜索的小字符串。
- 返回值:该函数返回在 haystack 中第一次出现 needle 字符串的位置(该字符串前面),如果未找到则返回 null。
首先我们要先创建一个TEST.config文件 内容如下:
SPEED=3
LENG=1
SCORE=9
LEVEL=5
1.3、程序演示:
如上图:修改后TEST.config文件中数据如下:
SPEED=3
LENG=5
SCORE=9
LEVEL=5
2、写入一个整型数到文件
函数原型:
首先我们要创建一个空文件file1,方便数据写入。
代码演示:
这里file1中的数据不是乱码,是计算机可以看懂的编码,且编译运行程序可以正常读出:read 100
3、写入一个结构体数组到文件
如上图:编译运行程序后,结构体数组里数据正常读出,且file中数据正常写入,编码为计算机可以看懂的语言。