使用 fgets 从文件中读取

Posted

技术标签:

【中文标题】使用 fgets 从文件中读取【英文标题】:Reading from file using fgets 【发布时间】:2012-03-15 02:34:24 【问题描述】:

我正在读取格式文件

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

这是我的代码 sn-p。

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

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

如何解决这个问题?

【问题讨论】:

文件最后一行的末尾是否有行尾\n 字符? 发布完整的实际代码,这甚至不应该编译。 【参考方案1】:

你需要检查fgets的返回值。如果读取成功,fgets 返回指向您传递给它的缓冲区的指针(即您的示例中的string)。如果遇到文件结尾并且没有读取任何字符,则fgets 返回NULL

试试这个:

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

【讨论】:

如果 fgets 这样做,你为什么要使用 feof 进行测试? @ManuelReis 你是对的,feof 测试是不必要的(已编辑)。 感谢您的回答,我有一秒钟的生存危机。 printf 内部发出的\n 不是必需的,因为它已经通过文件内部的fgets() 提供(如果有的话)。 假设 fgets() 返回值为 0,此代码有效。一般NULL不一定是0,一般是(void*)0。如果您使用 NULL 进行检查,代码更具可读性【参考方案2】:

eof 仅在您尝试从末尾的文件中读取之后 到达。您必须改用 fgets 的返回值(在 eof 或错误时返回 NULL,否则返回指针):

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

像这样检查返回值将导致你永远不会像另一个一样在循环体内点击 eof,而不是在条件中。

【讨论】:

以上是关于使用 fgets 从文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

C语言 fgets 从文件中读取一个字符串

fgets

fgets() 只读取最后一行 [关闭]

PHP 内置函数fgets读取文件

c语言逐行读取文件?

C语言文件读取fscanf(),该怎么处理