一、C文件的有关基本知识
1、什么是文件
2、文件名
3、文件的分类
4、文件缓冲区
5、文件类型指针
二、打开与关闭文件
1、打开与关闭文件
2、用fopen函数打开数据文件
使用方法:fopen("文件名",文件打开方式“);
3、用fclose函数关闭数据文件
使用方法:fclose(文件指针);
三、顺序读写数据文件
1、怎样向文件读写字符
读写一个字符的函数
例题:从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
例题:将一个磁盘文件中的信息复制到另一个磁盘文件中。今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。
读写一个字符串的函数
fgets函数原型: char *fgets(char *str, int n, FILE *fp);
调用方法:fgets(str,n,fp);
其中,n是要求得到的字符个数,但实际上只从fp所指向的文件中读入n-1个字符,然后在最后加一个′\0′字符,这样得到的字符串共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符“\n”或文件结束符EOF,读入即结束,但将所遇到的换行符“\n”也作为一个字符读入。若执行fgets函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读数据出错,则返回NULL。
fouts函数原型: int fputs (char *str, FILE *fp);
调用方法:fputs("China",fp)
把字符串″China″输出到fp指向的文件中。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的′\0′不输出。若输出成功,函数值为0;失败时,函数值为EOF(即-1)。
fgets和fputs这两个函数的功能类似于gets和puts函数,只是gets和puts以终端为读写对象,而fgets和fputs函数以指定的文件作为读写对象。
例题 : 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。
2、向文件读写一个字符串的函数
fgets函数的函数原型为 char *fgets(char *str, int n, FILE *fp);
其作用是从文件读入一个字符串。调用时可以写成下面的形式:
fgets(str,n,fp);
其中,n是要求得到的字符个数,但实际上只从fp所指向的文件中读入n-1个字符,然后在最后加一个′\0′字符,这样得到的字符串共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符“\n”或文件结束符EOF,读入即结束,但将所遇到的换行符“\n”也作为一个字符读入。若执行fgets函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读数据出错,则返回NULL。
fputs函数的函数原型为 int fputs (char *str, FILE *fp);
其作用是将str所指向的字符串输出到fp所指向的文件中。调用时可以写成
fputs("China",fp);
把字符串″China″输出到fp指向的文件中。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的′\0′不输出。若输出成功,函数值为0;失败时,函数值为EOF(即-1)。
fgets和fputs这两个函数的功能类似于gets和puts函数,只是gets和puts以终端为读写对象,而fgets和fputs函数以指定的文件作为读写对象。
注意:fgets是文本行输入函数,从文件中读数据一次只能读一行的数据
3、用格式化的方式读写文本文件
可以对文件进行格式化输入输出,这时就要用fprintf函数和fscanf函数,从函数名可以看到,它们只是在printf和scanf的前面加了一个字母f。它们的作用与printf函数和scanf函数相仿,都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对象不是终端而是文件。它们的一般调用方式为:
fprintf(文件指针, 格式字符串, 输出表列);
fscanf(文件指针, 格式字符串, 输入表列);
fprintf (fp,″%d,%6.2f″,i,f); //将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中
fscanf (fp,″%d,%f″,&i,&f);
//磁盘文件上如果有字符“3,4.5”,则从中读取整数3送给整型变量i,读取实数4.5送给float型变量f
4、用二进制方式向文件读写一组数据
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
buffer:是一个地址。对fread,它是用来存放从文件读入的数据的存储区的地址。对fwrite,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。
size:要读写的字节数。
count:要读写多少个数据项(每个数据项长度为size)。
fp:FILE类型指针
四、随机读写数据文件
1、文件位置标记及其定位
2、文件位置标记的定位
用rewind函数使文件位置标记指向文件开头 rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。
用fseek函数改变文件位置标记,fseek(文件类型指针, 位移量, 起始点);fseek函数一般用于二进制文件。
fseek (fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处
fseek (fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处
fseek (fp,-10L,2); //将文件位置标记从文件末尾处向后退10个字节
用ftell函数测定文件位置标记的当前位置 :ftell函数的作用是得到流式文件中文件位置标记的当前位置,用相对于文件开头的位移量来表示。如果调用函数时出错(如不存在fp指向的文件),ftell函数返回值为-1L。
例题:有一个磁盘文件,内有一些信息。要求第1次将它的内容显示在屏幕上,第2次把它复制到另一文件上。
五、文件读写的出错检测
1、ferror函数
ferror(fp);
在调用各种输入输出函数(如putc,getc,fread,fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 如果ferror返回值为0(假),表示未出错; 如果返回一个非零值,表示出错。
2、clearerr函数
clearerr的作用是使文件出错标志和文件结束标志置为0。 假设在调用一个输入输出函数时出现错误,ferror函数值为一个非零值。应该立即调用clearerr(fp),使ferror(fp)的值变成0,以便再进行下一次的检测。 只要出现文件读写出错标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。
注意:对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。 在执行fopen函数时,ferror函数的初始值自动置为0。