TOP
|
第10章 对文件的输入输出(二)
件的名字 ② 使用文件的方式(“读”还是“写”等) ③ 让哪一个指针变量指向被打开的文件 |
使用文件方式有如下形式:
说明:
(1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。不能用“r”方式打开一个并不存在的文件,否则出错。 |
(2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新建立一个新文件。 |
(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时应保证该文件已存在;否则将得到出错信息。在每个数据文件中自动设置了一个隐式的“文件读写位置标记”,它指向的位置就是当前进行读写的位置。如果“文件读写位置标记”在文件开头,则下一次的读写就是文件开头的数据。然后“文件读写位置标记”自动移到下一个读写位置,以便读写下一个数据。以添加方式打开文件时,文件读写位置标记移到文件末尾。 |
(4) 用“r+”“w+”“a+”方式打开的文件既可用来输入数据,也可用来输出数据。 |
(5) 如果不能实现“打开”的任务,fopen函数将会带回一个空指针值NULL。 |
(6) C标准建议用表10.1列出的文件使用方式打开文本文件或二进制文件,但目前使用的有些C编译系统可能不完全提供所有这些功能,需要注意所用系统的规定。 |
(8) 如果用“wb”的文件使用方式,并不意味着在文件输出时把内存中按ASCII形式保存的数据自动转换成二进制形式存储。输出的数据形式是由程序中采用什么读写语句决定的。例如,用fscanf和fprintf函数是按ASCII方式进行输入输出,而fread和fwrite函数是按二进制进行输入输出。 |
(9) 程序中可以使用3个标准的流文件——标准输入流、标准输出流和标准出错输出流。系统已对这3个文件指定了与终端的对应关系。标准输入流是从终端的输入,标准输出流是向终端的输出,标准出错输出流是当程序出错时将出错信息发送到终端。程序开始运行时系统自动打开这3个标准流文件。 |
注意:我们推荐使用以下方式打开文件
//打开一个文件的常用方法 if ((fp=fopen(″file1″,″r″))==NULL) { printf(″cannot open this file\n″); exit(0); } |
10.2.2 用fclose函数关闭数据文件
在使用完一个文件后应该关闭它,以防止它再被误用。
解释: “关闭”就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。 |
如果不关闭文件就结束程序运行将会丢失数据。
说明: 在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区时程序结束运行,就有可能使缓冲区中的数据丢失。用fclose函数关闭文件时,先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。有的编译系统在程序结朿前会自动先将缓冲区中的数据写到文件,从而避免了这个问题,但还是应当养成在程序终止之前关闭所有文件的习惯。 |
关闭文件用fclose函数。fclose函数调用的一般形式为:
fclose(文件指针);
如:fclose(fp);
注:fclose函数也带回一个值,当成功地执行了关闭操作,则返回值为0;否则返回EOF(-1)。
10.3 顺序读写数据文件
10.3.1 怎样向文件读写字符
读写一个字符的函数:
函数名 |
调用形式 |
功能 |
返回值 |
fgetc |
fgetc(fp) |
从fp指向的文件读入一个字符 |
读成功,带回所读的字符,失败则返回文件结束标志EOF(即-1) |
fputc |
fputc(ch,fp) |
把字符ch写到文件指针变量fp所指向的文件中 |
输出成功,返回值就是输出的字符;输出失败,则返回EOF(即-1) |
说明:
fgetc的第1个字母f代表文件(file),中间的get表示“获取”,最后一个字母c表示字符(character),fgetc的含义很清楚: 从文件读取一个字符。fputc也类似。 |
[例] 从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; //定义文件指针fp char ch,filename[10]; printf("请输入所用的文件名: "); scanf("%s",filename); //输入文件名 getchar(); //用来消化最后输入的回车符 if((fp=fopen(filename,"w"))==NULL) //打开输出文件并使fp指向此文件 { printf("cannot open file\n"); //如果打开出错就输出“打不开” exit(0); //终止程序 } printf("请输入一个准备存储到磁盘的字符串(以#结束): "); ch=getchar(); //接收从键盘输入的第一个字符 while(ch!='#') // |
|