【问题标题】:Reading text-file until EOF using fgets in C在 C 中使用 fgets 读取文本文件直到 EOF
【发布时间】:2016-12-22 22:16:16
【问题描述】:

在 C 中使用 fgets 在 EOF 之前读取文本文件的正确方法是什么?现在我有了这个(简化):

char line[100 + 1];
while (fgets(line, sizeof(line), tsin) != NULL) { // tsin is FILE* input
   ... //doing stuff with line
}

具体来说,我想知道是否应该有其他东西作为 while 条件?是否必须在 while 条件下执行从文本文件到“行”的解析?

【问题讨论】:

  • 解析应该在while循环中完成,或者我猜你可以将每一行存储到一个数组或其他东西中,然后在while循环之后进行解析。完成后关闭文件
  • 100% 没问题,您甚至可以只执行 while (fgets(line, sizeof(line), tsin)) {...} 并让 fgets 的返回本身作为测试。 (一个有效的指针将测试trueNULL 将测试false
  • 我认为你做得对,关于省略 != NULL 的答案不会增加价值。

标签: c while-loop fgets


【解决方案1】:

根据reference

成功时,函数返回 str。 如果在尝试读取字符时遇到文件结尾,则 eof 指示符为 设置(feof)。 如果在读取任何字符之前发生这种情况,则 返回的指针是一个空指针(并且 str 的内容保持不变 不变)。如果发生读取错误,则错误指示符 (ferror) 为 set 并返回一个空指针(但由 str 可能已更改)。

所以检查返回值是否为NULL 就足够了。解析也进入了while-body。

【讨论】:

    【解决方案2】:

    你所做的是 100% OK,但你也可以简单地依赖 fgets 的返回作为测试本身,例如

    char line[100 + 1] = "";  /* initialize all to 0 ('\0') */
    
    while (fgets(line, sizeof(line), tsin)) { /* tsin is FILE* input */
        /* ... doing stuff with line */
    }
    

    为什么? fgets 将在成功时返回指向 line 的指针,或者在失败时返回指向 NULL 的指针(无论出于何种原因)。一个有效的指针将测试true,当然,NULL 将测试false

    (注意:您必须确保line 是一个字符数组,声明在范围内 使用sizeof line 作为长度。如果line 只是一个指向数组的指针,那么您只是在读取sizeof (char *) 字符)

    【讨论】:

    • 除了样式/调试之外,我认为初始化所有 line[] 几乎没有价值。你看到其他价值了吗?
    • 不,除了总是试图给新的 C 程序员留下深刻印象,即初始化所有变量的成本与调试所花费的时间相比非常小。在这种情况下,这是唯一的一点。
    • 您的代码暗示 NULL 为 0,但并非所有平台都如此。
    • @AndersK.,根据 C 标准是这样,但Posix 更严格。
    • @AndersK。你有一个while (fgets(...)) 会失败的平台的例子吗?我很好奇,我还没有遇到过。
    【解决方案3】:


    我有同样的问题,我用这种方式解决了它

    while (fgets(line, sizeof(line), tsin) != 0) { //get an int value
       ... //doing stuff with line
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2015-06-23
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多