为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
MYYA 2019-12-16 09:41:06
我有一个文本文件,每一行都有字符串。我想为文本文件中的每一行增加一个数字,但是当到达文件末尾时,显然需要停止。我曾尝试过对EOF进行一些研究,但无法真正理解如何正确使用它。我假设我需要一个while循环,但是我不确定该怎么做。
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如何检测EOF取决于您用来读取流的内容:


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

检查输入调用的结果是否符合上述适当条件,然后调用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);

  ...

}

这种形式不工作的人认为它的方式,因为feof()之前将不会返回true 后,你已经尝试读取过去的文件的末尾。结果,循环执行的次数过多,这可能会或可能不会引起您的痛苦。


查看完整回答
反对 回复 2019-12-16
?
当年话下

TA贡献1890条经验 获得超9个赞

一种可能的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和类似的功能。经验表明,在错误的时间调用它并认为尚未达到eof会对其进行两次处理非常容易。


避免陷阱:char用于c的类型。getchar将下一个字符转换为unsigned char,然后返回int。这意味着在大多数[健全]平台上,EOF和的char值c不会重叠,因此您永远不会意外检测到EOF“正常” char。


查看完整回答
反对 回复 2019-12-16
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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


fscanf_s                   // read from file

while(condition)           // check EOF

{

   fscanf_s               // read from file

}


查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信