如何使用EOF运行C中的文本文件?

我有一个每行都有string的文本文件。 我想为文本文件中的每一行增加一个数字,但是当它到达文件末尾时,显然需要停止。 我试过对EOF进行一些研究,但不能真正理解如何正确使用它。

我假设我需要一个while循环,但我不知道如何做到这一点。

你如何检测EOF取决于你用什么来读取stream:

function result on EOF or error -------- ---------------------- fgets() NULL fscanf() number of succesful conversions less than expected fgetc() EOF fread() number of elements read less than expected 

检查input调用的结果是否符合上述条件,然后调用feof()来确定结果是由于打到EOF还是其他错误。

使用fgets()

  char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof buffer, stream) != NULL) { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

使用fscanf()

 char buffer[BUFFER_SIZE]; while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

使用fgetc()

 int c; while ((c = fgetc(stream)) != EOF) { // process c } if (feof(stream)) { // hit end of file } else { // some other error interrupted the read } 

使用fread()

 char buffer[BUFFER_SIZE]; while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 // element of size // BUFFER_SIZE { // process buffer } if (feof(stream)) { // hit end of file } else { // some other error interrupted read } 

请注意,表单对于所有的表单都是相同的:检查读取操作的结果; 如果失败, 检查EOF。 你会看到很多例子:

 while(!feof(stream)) { fscanf(stream, "%s", buffer); ... } 

这种forms不会像人们认为的那样工作,因为你试图读取文件末尾之后feof()才会返回true。 因此,循环执行一次太多,这可能会或可能不会导致你一些悲伤。

一个可能的C循环将是:

 #include <stdio.h> int main() { int c; while ((c = getchar()) != EOF) { /* ** Do something with c, such as check against '\n' ** and increment a line counter. */ } } 

现在,我会忽略feof和类似的function。 Exprience表明,在错误的时间把它称作是非常容易的,并且相信eof还没有被达到,所以处理了两次。

避免陷阱:使用char的typesc。 getchar返回下一个转换为unsigned char ,然后返回一个int 。 这意味着在大多数[理性]平台上, EOF的值和c有效的“ char ”值不会重叠,因此您将不会意外地检测到EOF作为“正常” char

从文件读取后,您应该检查EOF。

 fscanf_s // read from file while(condition) // check EOF { fscanf_s // read from file }