一、任务详情
自学教材第九章,提交学习笔记(10分)
本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
文本文件中考虑字符读写,行读写,任意位置读写等
文件操作都有什么?
二进制文件和文本文件如何转换?
数据结构如何读写?
...
二、知识点归纳
9.1 I/O库函数
系统调用是文件操作的基础,但它们只支持数据块的读/写。
I/O库函数是一系列文件操作函数,支持按逻辑单元读/写文件。
9.2 I/O库函数与系统调用
几乎每个支持C语言编程的操作系统都可提供文件I/O库函数,在Unix/Linux中, I/O库函数建立在系统调用的基础上。
系统调用函数与I/O库函数具有高度相似性,每个I/O库函数的根都在对应的系统调用函数中。
系统调用函数:
- open():打开文件
- read():从文件读取数据
- write():向文件写入数据
- lseek():设置文件读/写指针的位置
- close():关闭文件
I/O库函数: - fopen():打开文件并返回一个文件指针
- fread():从文件中读取二进制数据
- fwrite():向文件中写入二进制数据
- fseek():在文件中移动读/写指针的位置
- fclose():关闭文件
9.3 I/O库函数的算法
-
fread算法
C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。 -
fwrite算法
C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。 -
fclose算法
C 库函数 int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。
9.4 使用I/O库函数或系统调用
对于以BLKSIZE为单位的读/写数据来说,系统调用更高效。否则使用I/O库函数调用更高效。
9.5 I/O库模式
fopen()中的模式参数可以指定为:"r"、"w"、"a",分别代表读、写、追加。
每个模式字符串可以包含一个+号,表示同时读和写,或者在写入或追加时,如果文件不存在,则创建文件。
"r+"表示读/写,不会截断文件。
"w+"表示读/写,但会先截断文件;如果文件不存在,会创建文件。
"a+"表示通过追加进行读/写;如果文件不存在,会创建文件。
-
字符模式I/O
int fget(FILE *fp)
int ungetc(int c,FILE *fp)
int fputc(int c,FILE *fp) -
行模式I/O
char *fgets(char *buf,int size,FILE *fp)
int fputs(char *buf,FILE *fp) -
格式化I/O
格式化输入
scanf(char *FMT,&items)
fscanf(fp,char *FMT,&items)
格式化输出
printf(char *FMT,&items)
fprintf(fp,char *FMT,&items) -
内存中的转换函数
sscanf(buf,FMT,&items);
sprintf(buf,FMT,items); -
其他I/O库函数
fseek()、ftell()、rewind()
feof()、ferror()、fileno()
freopen()
setbuf()、setvbuf()
popen() -
其他I/O库函数
每对fread()和fwrite()之间至少有一个fseek()和ftell()
9.6 文件流缓冲
每个文件流都有一个FILE结构体,其中包含一个内部缓冲区。对文件读写需要遍历缓冲区。
- 无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。
- 行缓冲:遇到换行符时,写入行缓冲流的字符以块大小传输到文件或从文件传输。
- 全缓冲:写入全缓冲流或从中读取的字符以快大小传输到文件或从文件传输。
9.7 变参函数
在I/O库函数中, printf()相当独特,因为多种不同类型的可变数量参数可以调用它。
目前,C语言和C++会强制执行类型检查,但为了方便,这两种语言仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点。
9.8 编程项目:类printf函数
9.9习题
三、苏格拉底挑战
- 问题1
- 问题2
二、问题与解决思路
问题
(1)文件流是什么
(2)为什么文件流需要内部缓冲?