使用 fgets 从文件中读取

Reading from file using fgets

提问人:Kraken 提问时间:2/25/2012 最后编辑:Alejandro GaleraKraken 更新时间:6/12/2018 访问量:100440

问:

我正在从格式文件中读取

1 32 43 23
32 43
123 43 54 243 
123 2222
2

这是我的代码片段。

string[100];
while(!feof(fp))
    fgets(string,100,fp)

现在,当我把每个字符串都放在最后一个字符串中时,我会得到重复和更多的歧义(就像其他东西也被打印出来,比如 123 左右)。

如何解决这个问题?

C fgets 文件读取

评论

0赞 Sergey Kalinichenko 2/25/2012
文件中最后一行的末尾是否有行尾字符?\n
2赞 Staven 2/25/2012
发布完整的实际代码,这甚至不应该编译。

答:

7赞 Seth Carnegie 2/25/2012 #1

只有在您尝试从末尾的文件中读取,才会到达。您必须使用 instead 的返回值(在 eof 或 error 时返回,否则会给出指针):eoffgetsNULL

char string[100];
while(fgets(string, 100, fp))
    // do stuff with string

像这样检查返回值将导致您永远不会像另一个一样命中循环主体内部的 eof,而不是在条件中。

27赞 Sergey Kalinichenko 2/25/2012 #2

您需要检查 fgets 的返回值。如果读取成功,则返回指向传递给它的缓冲区的指针(即 在您的示例中)。如果遇到 End-of-File 并且未读取任何字符,则返回 .fgetsstringfgetsNULL

试试这个:

char string[100];
while(fgets(string, 100, fp)) {
    printf("%s\n", string);
}

评论

1赞 Manuel Reis 1/26/2015
如果 fgets 这样做,你为什么要用 feof 进行测试?
2赞 Sergey Kalinichenko 1/26/2015
@ManuelReis 你是对的,测试是不必要的(编辑)。feof
4赞 Manuel Reis 1/26/2015
谢谢你的回答,我有一秒钟的生存危机。
2赞 alk 11/8/2016
内部发出的不是必需的,因为它已经从文件内部(如果周围)通过。\nprintffgets()
0赞 overexchange 1/2/2017
假设 fgets() 返回值为 0,则此代码有效。一般 NULL 不一定是 0,一般是 。如果使用 NULL 进行检查,则代码更具可读性(void*)0