和其他高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。
1、文件的打开(fopen函数)
ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件。fopen函数的调用方式通常为
FILE *fp;
fp=fopen(文件名,使用文件方式);
例如:
fp=fopen("al","r");
它表示要打开名字为al的文件,使用文件方式为“读入”(r 代表read,即读人),fopen函数带回指向al文件的指针并赋给fp,这样 fp 就和文件a1相联系了,或者说,fp指向 al文件。可以看出,在打开一个文件时,通知给编译系统以下3个信息:①需要打开的文件名,也就是准备访问的文件的名字。②使用文件的方式(“读”还是“写”等)。③让哪一个指针变量指向被打开的文件。
使用文件方式见表13.1.
表 13.1
文件使用方式 | 含义 |
“r”(只读) | 为输人打开一个文本文件 |
"w"(只写) | 为输出打开一个文本文件 |
“a”(追加) | 向文本文件尾增加数据 |
“rb”(只读) | 为输人打开一个二进制文件 |
"wb"(只写) | 为输出打开一个二进制文件 |
"ab"(追加) | 向二进制文件尾增加数据 |
"r+”(读写) | 为读/写打开一个文本文件 |
"w+"(读写) | 为读/写建立一个新的文本文件 |
"a+"(读写) | 为读/写打开一个文本文件 |
"rb+"(读写) | 为读/写打开一个二进制文件 |
"wb+"(读写) | 为读/写建立一个新的二进制文件 |
"ab+"(读写) | 为读/写打开一个二进制文件 |
说明:
(1)用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件(即输入文件),否则出错。
(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。
(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。
(4)用“r+”、“w+”、“a+”方式打开的文件既可以用来输入数据,也可以用来输出数据。用“r+”方式时该文件应该已经存在,以便能向计算机输人数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。
(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时 fopen 函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0)。
常用下面的方法打开一个文件:
if ((fp=fopen (" file1" ,"r"))==NULL)
{
printf("cannot open this file\n" );
exit(0);
}
即先检查打开的操作有否出错,如果有错就在终端上输出“cannot open this file",exit数的作用是关闭所有文件,终止正在执行的程序。待用户检查出错误,修改后再运行。
(6)用以上方式可以打开文本文件或二进制文件,这是ANSIC的规定,用同一种缓冲文件系统来处理文本文件和二进制文件。但目前使用的有些C编译系统可能不完全提供所有这些功能(例如有的只能用“r”、“w”、“a”方式),有的C版本不用“r+”,“w+"、"a+”,而用“rw”、“wr”、“ar”等,请读者注意所用系统的规定。
(7)在向计算机输人文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。
(8)在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此以前我们所用到的从终端输入或输出都不需要打开终端文件。系统自动定义了3个文件指针stdin,stdout 和stderr,分别指向终端输人、终端输出和标准出错输出(也从终端输出)。如果程序中指定要从stdin所指的文件输人数据,就是指从终端键盘输人数据。
2 、文件的关闭(fclose函数)
在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。
用fclose函数关闭文件。fclose函数调用的一般形式为
fclose(文件指针);
例如:
fclose(fp);
前面我们曾把打开文件(用fopen函数)时所带回的指针赋给了fp,今通过fp把该文件关闭。即fp不再指向该文件。
应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会丢失数据。因为,如前所述,在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用 felose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。
fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为0;否则返回EOF(-1)。可以用ferror函数来测试。