文件IO(INPUT/OUTOUT)系统
在Linux中一切皆文件,对于文件的一般操作就是打开创建、读写、关闭等。
windos:在Windows中的文件夹必须比里面的子文件夹大
Linux:在Linux中的文件夹可以比里面的子文件夹小
权限: rwx ——rwx ——rwx
管理员 用户 普通用户
普通文件只能关闭写的权限,使得文件变成只读形式;如果关掉读和可执行权限就没有任何意义了;
man操作下面库中的文件分为七类:
使用:man N+函数名——可以看见Linux文件分为七类
1.普通文件(regular)
2.目录文件(directory)
3.管道文件(pipe)
4.套接字文件(socket)
5.块设备文件(block)
6.链接文件(link)
7.字符设备文件(character)
printf()的返回值:返回输出了多少个字符
求字符串长度使用sizeof,对二进制数据使用strlen
打开文件(open):
功能 | 打开一个指定的文件并获得文件描述符,或者创建一个新文件 | ||
头文件 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> | ||
原型 | int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); | ||
参数 | pathname:即将要打开的文件 | ||
flags | O_RDONLY:只读方式打开文件 | 这三个参数互斥 | |
O_WRONLY:只写方式打开文件 | |||
O_RDWR:读写方式打开文件 | |||
O_CREAT:如果文件不存在,则创建该文件。 | |||
O_EXCL:如果使用 O_CREAT 选项且文件存在,则返回错误消息。 | |||
O_NOCTTY:如果文件为终端,那么终端不可以作为调用 open()系统调 用的那个进程的控制终端。 | |||
O_TRUNC:如文件已经存在,则删除文件中原有数据。 | |||
O_APPEND:以追加方式打开文件。 | |||
mode | 如果文件被新建,指定其权限为 mode (八进制表示法) | ||
返回值 | 成功 | 大于等于 0 的整数 (即文件描述符) | |
失败 | - 1 | ||
备注 | 无 |
open返回值:是文件在文件库中的文件数组打开的编号(数组下标)
全局变量:errno:记录错误编号
strerror(errno):将错误编码转换为字符串输出
输出:
perror():打印错误——将上面一大段整合到一起
输出:
例如:打开文件
int fd1 = open("./1.txt", O_RDONLY); // 打开源文件1.txt,只读模式
if (-1 == fd1) {
perror("fd1 error");
return -1;
}
打开文件,若没有就创建文件:
int fd2 = open("./666.txt", O_RDWR | O_CREAT, 0777);
if(-1 == fd2)//(-1 == fd)
{
printf("open 666.txt 失败\n");
return -1;
}
读取文件(read):
功能 | 从指定文件中读取数据 | |
头文件 | #include <unistd.h> | |
原型 | ssize_t read(int fd, void *buf, size_t count); | |
参数 | fd:从文件fd 中读数据 | |
buf:指向存放读到的数据的缓冲区 | ||
count:存放整个缓冲区的大小,在读取的时候会将整个缓冲区都读取完,就算有一半没有数据也会读取完。 | ||
返回值 | 成功 | 实际读到的字节数(返回值可以理解为一个整形) |
失败 | - 1 | |
备注 | 实际读到的字节数小于等于 count |
固定大小缓存区buf读取不同大小的文件:
每次循环都要清空一下buf,否则可能会残留上一次的数据
memset(buf,0,sizeof(buf));
之所以在创建buf的时候要清空是为了:在创建缓冲区(buf)时清空它的目的是为了确保在使用缓冲区之前,它的内容是空的。这是为了避免在使用缓冲区之前可能存在的旧数据或垃圾数据对程序的影响。
清空缓冲区可以避免不必要的错误或不确定行为。例如,如果你创建一个用于存储字符串的缓冲区,但没有清空它,那么缓冲区中可能会包含之前存储的字符串的残留数据。当你试图向缓冲区写入新的字符串时,旧数据可能会干扰新数据的正确存储,从而导致输出错误。
因此,在使用缓冲区之前,清空它可以确保缓冲区中的内容是干净的、空的,这有助于保证程序的正确性和可预测性。清空缓冲区的方法可能因编程语言和上下文而异,但其目的是一致的。
读取例如:
int n = read(fd1, buf, sizeof(buf)); // 从源文件中读取数据到缓冲区
if (n <= 0) {
break; // 读取到达文件末尾,退出循环
}
write:
功能 | 将数据写入指定的文件 | |
头文件 | #include <unisth.h> | |
原型 | ssize_t write(int fd, const void *buf,size_t count); | |
参数 | fd:将数据写入到文件 fd 中 | |
buf:指向即将要写入的数据 | ||
count:要写入的字节数 | ||
返回值 | 成功 | 实际写入的字节数,返回值可以理解为一个整形 |
失败 | - 1 | |
备注 | 实际写入的字节数小于等于 count |
如果文件之前有数据,我们在向里面写入数据,就会覆盖掉之前的内容。
write(fd2, buf, n); // 将缓冲区的数据写入目标文件
lseek
功能 | 调整文件位置偏移量 | ||
头文件 | #include <sys/types.h> #include <unistd.h> | ||
原型 | off_t lseek(int fd, off_t offset, int whence); | ||
参数 | fd:要调整位置偏移量的文件的描述符 | ||
offset:新位置偏移量相对基准点的偏移,就是当光标到了新位置以后要不要在偏移,可正可负 | |||
whence:基准点 | SEEK_SET:文件开头处 | ||
SEEK_CUR:当前位置 | |||
SEEK_END:文件末尾处 | |||
返回值 | 成功 | 新文件位置偏移量 | |
失败 | - 1 | ||
备注 | 无 |
使用方式:lseek(file_fd,0,SEEK_END);
注意:lseek( )只对普通文件凑效,特殊文件是无法调整偏移量的
区分两个文件的不同(diff)
diff用于比较两个文件的内容差异
语法:diff [选项] <文件1> <文件2>
其中 <文件1>
和 <文件2>
是要比较的两个文件的路径,<选项>
是一些可选参数,用于指定比较的方式和输出格式。
diff
命令会逐行比较两个文件的内容,并以特定的格式显示差异,常见的差异标记包括:
<
表示该行仅在<文件1>
中出现>
表示该行仅在<文件2>
中出现---
表示两个文件中相同的内容!
表示两个文件中有差异的行
diff
命令还支持一些选项,用于控制比较和输出的行为。常见的选项包括:
-q
或--brief
:仅显示是否有差异,不显示具体差异内容。-r
或--recursive
:递归比较目录下的所有文件。-u
或--unified
:以统一 diff 格式显示差异。-c
或--context
:以上下文 diff 格式显示差异。
通过使用不同的选项,可以根据需要定制 diff
命令的输出结果。
需要注意的是,diff
命令仅用于比较文本文件的内容,对于二进制文件或特殊格式的文件可能不适用。此外,diff
命令只能比较文件之间的差异,并不能修改文件内容。如果需要将差异应用到文件中,可以使用 patch
命令将差异文件(由 diff
命令生成)应用到原始文件中。