ch = fgetc(fp); if (ferror(fp)) {
/* 如果此操作错误,就发布错误信息*/ printf(\ /*复位错误标志*/ clearerr(fp); }
/*关闭文件*/ fclose(fp); return 0; }
例程说明:
(1)首先程序以只写的方式打开一个文件名为”test.txt”的文件。这样,该文件就只能写而不能读了。
(2)程序企图应用fgetc函数从fp所指的文件中读出一个字符,这当然是违法的,因此文件自动产生错误标志。
(3)当用ferror函数检测出文件流存在错误时,就发布一条错误信息,并用clearerr函数清除fp指定的文件流所使用的错误标志,也就是使fp所指的文件的错误标志和文件结束标志置0。这样原先的错误就不会对文件的后续操作产生影响。
注意:ferror函数与clearerr函数应该配合使用。也就是说,通过ferror函数检测出文件有错误标志后要用clearerr函数复位错误标志。
feof:检测文件结束符函数
函数原型:int feof(FILE *fp); 头文件:#include
函数功能:检测流上的文件结束符,即:检测文件是否结束。应用该函数可以判断一个文件是否到了结尾。在读取一个未知长度文件时,这个函数很有用。
返回值:遇到文件结束符返回非0,否则返回0。 例程如下::检测文件结束标志演示。
#include
int main(void) {
FILE *stream;
/* 以只读方式打开test.txt文件 */ stream = fopen(\ /* 从文件中读取一个字符 */ fgetc(stream);
/*检测是否是EOF,即结束标志 */ if (feof(stream))
printf(\ /* 关闭该文件 */ fclose(stream); return 0; }
例程说明:
(1)首先程序打开一个名为test.txt的文件。
(2)应用fgetc函数从一个名为test.txt的文件中读取一个字符。 (3)判断它是否为文件结束标志EOF,如果是文件结束标志,就说明该文件已经结束,于是在屏幕上显示一条提示信息。如果不是文件的结束标志,就说明文件还未结束,信息不显示。
(4)最后关闭文件。
注意:在实际应用中,feof函数很重要,利用它程序员就可以很方便地判断当前的文件是否结束,从而进行不同的处理。例如,在从一个未知长度的文件中读取信息时,就可以利用feof函数判断什么时候该文件读完。
ferror:检测流上的错误函数
函数原型:int ferror(FILE *fp); 头文件:#include
函数功能:检测流上的错误。即:检查文件在使用各种输入输出函数进行读写时是否出错。当输入输出函数对文件进行读写时出错,文件就会产生错误标志。应用这个函数,就可以检查出fp所指向的文件操作是否出错,也就是说是否有错误标志。
返回值:未出错返回值为0,否则返回非0,表示有错。 例程如下:应用ferror函数检查流上的错误。
#include
FILE *fp; char ch;
/* 以写的方式打开一个文件名为test.txt的文件 */ fp = fopen(\
/* 错误地从fp所指定的文件中读取一个字符,并打印它*/ ch = fgetc(fp); printf(\ if (ferror(fp)) {
/* 如果此操作错误,就发布错误信息*/ printf(\ /*复位错误标志*/ clearerr(fp); }
/*关闭文件*/ fclose(fp); return 0; }
例程说明:
(1)首先以只写的方式打开一个文件名为”test.txt”的文件。这样,该文件就只能写而不能读了。程序企图用fgetc函数从fp所指的文件中读出一个字符,这样就是非法操作,也就是说在用fgetc函数进行读取字符时出错了,因此文件产生错误标志。
(2)再用ferror函数来检测输入输出函数进行文件读写操作时是否出错,结果发现有错,因此函数返回一个非0整型数,并提示出错信息。
fflush:清除文件缓冲区函数
函数原型:int fflush(FILE *fp); 头文件:#include
函数功能:清除一个流,即清除文件缓冲区,当文件以写方式打开时,将缓冲区内容写入文件。也就是说,对于ANSI C规定的是缓冲文件系统,函数fflush用于将缓冲区的内容输出到文件中去。
返回值:如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
例程如下:第一种方式读写文件
#include
int main(void) {
FILE *stream1,*stream2; char test[20]=\char res[20];
/*以写的方式打开文件test.txt*/ stream1 = fopen(\ /*向文件写入字符串*/
fwrite(test,15,1,stream1);
/*以读的方式打开文件test.txt*/ stream2 = fopen(\ /*将文件内容读入缓冲区*/ if(fread(res,15,1,stream2)) printf(\else
printf(\fclose(stream1); fclose(stream2); getch(); return 0; }
例程如下::第二种方式读写文件
#include
int main(void) {
FILE *stream1,*stream2; char test[20]=\char res[20];
/*以写的方式打开文件test.txt*/ stream1 = fopen(\ /*向文件写入字符串*/
fwrite(test,15,1,stream1); /*将缓冲区的内容写入文件*/ fflush(stream1);
/*以读的方式打开文件test.txt*/ stream2 = fopen(\ /*将文件内容读入缓冲区*/ if(fread(res,15,1,stream2)) printf(\else
printf(\fclose(stream1); fclose(stream2); getch(); return 0; }
例程说明:
例程如下:中定义了两个文件指针stream1和stream2。
(1)首先以写的方式打开文件test.txt,用指针stream1指向该文件,并向文件中写入字符串\。
(2)不关闭该文件,以读的方式打开文件test.txt,并用指针stream2指向该文件,试图将刚刚写入的字符串读入到内存缓冲区中。如果读入成功,打印出该字符串,否则报错。
实践证明,例程如下:的输出结果是在屏幕上显示错误信息Read error!。 例程如下:中定义了两个文件指针stream1和stream2。
(1)首先以写的方式打开文件test.txt,用指针stream1指向该文件,并向文件中写入字符串\。
(2)调用fflush函数将缓冲区的内容写入文件。
(3)不关闭该文件,以读的方式打开文件test.txt,并用指针stream2指向该文件,试图将刚刚写入的字符串读入到内存缓冲区中。如果读入成功,打印出该字符串,否则报错。
实践证明,例程如下:的输出结果是在屏幕上显示字符串\。
产生这样的效果原因在于:例程如下:中将文件打开后,指针stream1指向的是该文件的内存缓冲区,将字符串写入后也只是写到了文件的内存缓冲区中,而并没有写到磁盘上的文件中。而当以读的方式打开该文件时,该文件中的内容实际为空,也就是stream2指向的缓冲区中内容为空。因此读文件发生错误。而例程如下:中,在写完文件后调用函数fflush,将缓冲区的内容写到文件中,这样再以读的方式打开该文件时,文件中已经存有了字符串,因此可以正常读出。
注意:如果在写完文件后调用函数fclose关闭该文件,同样可以达到将缓冲区的内容写到文件中的目的,但是那样系统开销较大。
fgetc:从流中读取字符函数
函数原型:int fgetc(FILE *fp); 头文件:#include
返回值:返回所得到的字符,若读入错误。返回EOF。 例程如下:应用fgetc函数从文件中自动读取字符。
#include
#include
FILE *fp;
char string[] = \ char ch;
/* 以读写方式打开一个名为test.txt的文件 */ fp = fopen(\
/* 向文件中写入字符串string */ fwrite(string, strlen(string), 1, fp); /* 将fp指针指向文件首 */ fseek(fp, 0, SEEK_SET); do {
/* 从文件中读一个字符 */ ch = fgetc(fp);
/* 显示该字符 */ putch(ch);
} while (ch != EOF); fclose(fp); return 0; }
例程说明:
(1)首先程序先以读写方式打开一个名为test.txt的文件,并向该文件中写入一个字符串。
(2)再应用fseek函数将文件指针fp定位在文件的开头,再循环地将字符逐一读出。这里每读出一个字符,指针fp会自动地向后移一个字节,直至读到文件尾,即EOF标志,循环才停止。因为fgetc函数的返回值为得到的字符,所以用一个字符型变量ch 来接受读出的字符。
(3)最后的运行结果是在屏幕上打印出This is a test字符串。
fgetpos:取得当前文件的句柄函数
函数原型:int fgetpos( FILE *stream, fpos_t *pos ); 头文件:#include
返回值:成功返回0,失败返回非0,并设置errno。
例程如下:应用fgetpos函数取得当前文件的指针所指的位置。
#include
FILE *fp;
char string[] = \ fpos_t pos;
/* 以读写方式打开一个名为test.txt的文件 */