I/O库函数
- 方便用户使用,提高文件操作整体效率的一系列文件操作函数。
I/O库函数与系统调用
系统调用函数
- open()
- read()
- write()
- lseek()
- close()
I/O库函数
- fopen()
- fread()
- fwrite()
- fseek()
- fclose()
I/O库函数的算法
fread
- 在第一次调用fread()时,FILE结构体的缓冲区是空的,fread()使用保存的文件描述符fd发出一个
n= read (fd, fbuffer, BLKSIZE); - 在随后的每次fread()调用中,它都尝试满足来自FILE结构体内部缓冲区的调用。
fwrite
- 与fread()算法类似,只是数据传输方向不同。
fclose算法
I/O库模式
- fopen()中的模式参数可以指定为:“r”、“w”、“a”,分别代表读、写、追加。
- “r+”:表示读/写,不会截断文件。
- “w+”:表示读/写,但是会先截断文件;如果文件不存在,会创建文件。
- “a+”:表示通过追加进行读/写;如果文件不存在,会创建文件。
实践
- 编写一个C程序,计算文本文件的行数
编写C程序
编译
运行
行模式I/O
char *fgets(char *buf,int size,FLIE *fp)
int fputs(char *buf,FILE *fp)
格式化I/O
- 格式化输入
- 格式化输出
内存中的转换函数
其他I/O库函数
- fseek()、ftell()、rewind():更该文件流中的读/写字节位置
- feof()、ferr()、fileno():测试文件流状态
- fdopen():用文件描述符打开文件流
- freopen():以新名称重新打开现有的流
- setbuf()、setvbuf():设置缓冲方案
- popen():创建管道,复刻子进程来调用sh
限制混合fread-fwrite
- 当某文件流同时用于读、写时,就会限制使用混合fread()和fwrite()调用。规范要求每对fread()和fwrite()之间至少有一个fseek()和ftell()。
文件流缓冲
- 无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输
- 行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输
- 全缓冲: 写入全缓冲流或从中读取的字符以块大小传输到文件或从文件中传输
- _IONBUF: 无缓冲
- _IOLBUF: 行缓冲
- _IOFBUF: 全缓冲
苏格拉底挑战