🌿前言:在我看来,书应该越读越薄的,所以我的笔记尽量记录了每一个点,可供复习与查阅,但没有详细的解释。我的C语言的笔记是在谭浩强老师的C程序设计(第五版)的基础上总结归纳的,结合了一些我自己的见解。如果是有其他见解 ,也欢迎大家提出。
一、c文件的有关基本知识
1.什么是文件
(1)程序文件
包括源程序文件(后缀为.c),目标文件(后缀为.obj),可执行文件(后缀为.exe)等,这种文件的内容是程序代码。
(2)数据文件
· 操作系统把各种设备都统一作为文件来处理
· 文件一般指储存在外部介质上的数据的集合。流,数据流就是输入输出。
· C语言把文件看做一个字符或字节的序列,即由一个个字符或字节的数据顺序组成。一个输入输出流就是一个字符流或字节(内容为二进制数据)流。
· C的数据文件有一连串的字符或字节组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制,而不受物理符号(如回车换行符)控制,这就增加了处理的灵活性,这种文件称为流式文件。
2.文件名
文件名,也就是文件标识,包括三部分文件路径,文件名主干以及文件后缀。
D:\CC\temp\filel . dat
D:\CC\temp→文件路径
\filel→文件名主干
. dat→文件后缀
3.文件的分类
(1)数据的存储方式
文本方式:数据以字符方式(ASCⅡ代码)存储到文件中。如整数12,送到文件时占2个字节,而不是4个字节。以文本方式保存的数据便于阅读。
二进制方式:数据按在内存的存储状态原封不动地复制到文件。如整数12,送到文件时和在内存中一样占4个字节。
(2)文件的分类
文本文件(ASCII文件):文件中全部为ASCII字符。
二进制文件:按二进制方式把在内存中的数据复制到文件的,称为二进制文件,即映像文件。
(3)字符一律以ASCII形式存储,数值型数据既可以用该形式存储,也可以用二进制形式存储。
(4)以ASCII码输出占存储空间多,而且要花时间转换。用二进制形式输出数值,可以节省外存空间和转换时间。
4.文件缓冲区
· 缓冲文件系统是指系统自动的在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,从内存上磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。
· 每一个文件在内存中只有一个缓冲区,在向文件输出数据时,它就作为输出缓冲区,输入时就作为输入缓冲区。
5.文件类型指针
(1)每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息,如文件的名字,文件状态及文件当前位置等,这些信息会保存在一个结构体变量中,该结构体类型是由系统声明的,取名为FILE。
(2)定义一个指向文件型数据的指针变量
FILE *fp;
通常将这种指向文件信息区的指针变量简称为指向文件的指针变量,通过文件指针变量就能够找到与它关联的文件。
二、打开与关闭文件
打开与关闭文件就是建立或撤销与文件相应的信息区和文件缓冲区
1.用fopen函数打开数据文件
(1)fopen函数调用的一般形式
fopen(文件名,使用文件方式);
通常将其返回值赋给一个指向文件的指针变量
(2)使用文件方式
文件使用方式 | 含义 | 如果指定的文件不存在 |
---|---|---|
r(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
w(只写) | 为了输入数据,打开一个文本文件 | 建立新文本 |
a(追加) | 向文本文件尾添加数据 | 出错 |
rb(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
wb(只写) | 为了输入数据,打开一个二进制文件 | 建立新文本 |
ab(追加) | 向二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文本文件 | 建立新文本 |
“a+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“rb+”(读写) | 为了读和写,打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,建立一个新的二进制文件 | 建立新文本 |
“ab+”(读写) | 为了读和写,打开一个二进制文件 | 出错 |
Ps:文件的打开方式
文本方式:不带b的方式,读写文件时对换行符进行转换。
二进制方式:带b的方式,读写文件时对换行符不进行转换。
(3)方法举例
if((fp=fopen(“filel”,”r”))==NULL)
{printf(“cannot open this file\n”);
exit(0);
}
· exit函数的作用是关闭所有文件,终止正在执行的程序,待用户检查出错误,修改后重新运行。使用时应在开头应包含stdilb.h头文件
· 如果用wb的文件使用方式,并不意味着在文件输出时把内存中按ASCII形式保存的数据自动转换成二进制形式存储。输出的数据形式是由程序中采用什么读写语句决定的。
· 程序中可以使用三个标准的流文件,标准输入流,标准输出流和标准出错输出流。程序开始运行时,系统自动打开这三个标准流文件。系统定义了三个文件指针变量stdin,stdout和stderr,分别指向标准输入流,标准输出流和标准出错输出流,可以通过这三个指针变量对以上三种流进行操作,它们都以终端作为输入输出对象。
2.用fclose函数关闭数据文件
(1)fclose函数调用的一般形式
fclose(文件指针);
(2)如果不关闭文件就结束程序运行,将会丢失数据。因为在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件,如果当数据未充满缓冲区时,程序就结束运行,就有可能使缓冲区中的数据丢失。
(3)fclose函数也带回一个值,当成功的执行了关闭操作,则返回值为零,否则返回EOF (-1)。
三、顺序读写数据文件
1.文件读写函数
文本读写函数:用来向文本文件读写字符数据的函数
(如fgetc,fgets,fputc,fputs,fscanf,fprintf等)。
二进制读写函数:用来向二进制文件读写二进制数据的函数
(如getw,putw,fread,fwrite等)。
2.怎样向文件读写字符
函数名 | 调用形式 | 功能 | 返回值 |
---|---|---|---|
fgetc | fgetc(fp) | 从fp指向的文件读入一个字符 | 读成功,返回所读的字符,失败返回EOF(-1) |
fputc | fputc(ch,fp) | 把字符ch写到文件指针变量fp所指向的文件中 | 输出成功,返回输出的字符,失败返回EOF(-1) |
3.怎样向文件读写一个字符串
函数名 | 调用形式 | 功能 | 返回值 |
---|---|---|---|
fgets | fgets(str,n,fp) | 从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中 | 读成功,返回地址str,失败返回NULL |
fputs | fputs(str,fp) | 把str所指向的字符串写到文件指针变量fp所指向的文件中 | 输出成功,返回0,失败返回非0值 |
4.用格式化的方式读写文本文件
(1)格式化读写函数及其一般调用函数
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
Ps:其读写对象是文件而不是终端
在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf
5.用二进制方式向文件读写一组数据
(1)fread函数——从文件中读一个数据块
fread(buffer,size,count,fp);
(2)fwrite函数——向文件写一个数据块
fwrite(butter,size,count,fp);
其中butter是地址,size是要读写的字节数,count是要读写多少个数据项(每个数据项的长度为size)。
· 在打开文件时指定用二进制文件,这样就可以用fread和fwrite函数读写任何类型的信息
· 使用示例:
for(i=0;i<40;i++)
fread(&stud[i],sizeof(struct Student_type),1,fp);
四、随机读写数据文件
1.文件位置标记及其定位
(1)文件位置标记
(2)文件位置标记的定位
可强制使文件位置标记指向人们指定的位置
A.rewind函数——使文件位置标记重新返回文件开头
如:rewind(fp1);
B.fseek函数——改变文件位置标记到指定位置
fseek(文件类型指针,位移量,起始点);
· 起始点用0(代表文件开始位置),1(代表当前位置)或2(代表文件末尾位置)代替,
· 位移量指以起始点为基点,向前移动的字节数。位移量应该是long型数据
· fseek一般用于二进制文件
C.ftell函数——测定文件位置标记的当前位置
· 其结果用相对于文件开头的位移量来表示
· 如果调用函数时出错,ftell的返回值为-1L
2.随机读写
五、文件读写的出错检测
1.ferror函数
ferror(fp);
· 如果其返回值为0(假),表示未出错;如果返回一个非零值,表示出错。
· 在执行fopen函数时,ferror函数的初始值自动置为0。
2.clearerr函数
clearerr(fp);
· 使文件出错标志和文件结束标志置为0;