C语言IO操作
文件的概念和类型
概念:一组相关数据的有序集合
文件类型:
- 常规文件 r
- 目录文件 d
- 字符设备文件 c
- 块设备文件 b
- 管道文件 p, 进程间通信的机制
- 套接字文件 s, 进程间通信的机制
- 符号链接文件 l
如何理解标准IO
标准IO由ANSIC标准定义,就是用标准C语言定义好的一组用来输入和输出的API
主流操作系统(Linux,Windows)上都实现了C库
标准IO通过缓冲机制减少系统调用,实现更高的效率
流(FILE)的含义
标准IO用一个结构体数据类型来存放打开的文件的相关信息
标准IO的所有操作都围绕FILE来进行
FILE又被称为流(stream)
流分为两种流分别是
文本流:Windows系统中文本流的换行符占用两个字节用“\r\n”表示,LInux中用‘\n’表示
二进制流:Windows系统二进制流的换行符占用一个字节用“\n”表示,LInux中用‘\n’表示
流的缓冲
全缓冲:当流的缓冲区无数据或无空间时才执行实际IO操作
行缓冲:当在输入和输出中遇到换行符“\n”时,进行IO操作;当流和一个终端关联时,是典型的行缓冲
无缓冲:数据直接写入文件,流不进行缓冲,一般在打印错误信息时使用
标准IO预定义3个流,程序运行时自动打开
标准输入流 | 0 | STDIN_FILENO | stdin |
标准输出流 | 1 | STDOUT_FILENO | stdout |
标准错误流 | 2 | STDERR_FILENO | stderr |
流的打开
下列函数可用于打开一个标准IO流
FILE *fopen(const char *path, const char *modle);
成功时返回流指针;出错时返回NULL
model参数
模式 | 描述 |
---|---|
r或rb | 打开一个已有的文本文件,允许读取文件。 |
w或wb | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a或ab | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+或r+b | 打开一个文本文件,允许读写文件。 |
w+或w+b | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+或a+b | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
当给定b参数时,表示以二进制方式打来文件,但linux下忽略该参数
fopen新建文件权限
fopen()创建的文件访问权限是0666(rw-rw-rw),0表是8进制数
Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & (~umask)),可以通过umask命令查看,默认为0022
0022 ----> 000 010 010
取反 ----> 111 101 101
0666 ----> 110 110 110
结果:---> 110 100 100 ---> 0644(rw-r--r--)
用户可以通过umask函数修改相关设定,将umask设置为0时,umask不影响文件访问权限
错误信息处理
extern int errno;//存放错误号
void perror(const char *s);//向输出字符串s,再输出错误号对应的错误信息
char *strerror(int errno);//根据错误号返回对应的错误信息
流的关闭
int fclose(FILE *stream)
fclose()调用成功返回0,失败返回EOF,并设置errno
流关闭时自动刷新缓冲中的数据并释放缓冲区
当一个程序正常终止时,所有打开的流都会被关闭,但是为了安全期间,程序员要主动关闭
流一旦关闭后就不能执行任何操作