【问题标题】:Is only fgets() best avoided in binary mode?在二进制模式下最好避免使用 fgets() 吗?
【发布时间】:2014-09-13 23:53:45
【问题描述】:

维基百科说:

最好避免在二进制模式下使用 C 库函数 fgets(),因为 任何未使用 UNIX 换行约定写入的文件都将被误读。

在二进制模式下最好避免使用 fgets() 吗? 其他读取文件的 C 库函数怎么样?

谢谢。

【问题讨论】:

  • 这是一个用于读取一行文本的函数。它与二进制文件无关。

标签: c character


【解决方案1】:

fgets() 读取一行文本,以单个 '\n' 换行符终止(如果下一个输入行长于您正在使用的缓冲区,则为部分行)。

在文本流上使用时,实际的行尾标记(无论其表示方式如何)都会转换为单个 '\n' 字符,因此 fgets() 将按预期工作。

fgets() 在二进制流上不太可能有用。它仍然会读取直到缓冲区末尾或第一个 '\n' 字节的字符,以先出现者为准。如果这恰好是您想要做的,没有特别的理由不使用fgets()

二进制文件的内容具有您赋予它们的任何含义。如果给定的二进制文件使用'\n' 作为分隔符——无论它是否恰好是系统的行尾标记用于文本文件——那么fgets() 可能会起作用。

但如果你有一个二进制文件,其中记录(?)用'\n' 字符标记,我不得不想知道为什么它一开始就不是文本文件。

fgets() 旨在用于从文本流中读取行,但其工作方式由 C 标准严格定义。它被定义为通过重复调用fgetc()一样工作。

如果它碰巧对其他东西有用,请随意使用它。但是您的要求中的任何细微变化,例如使用 '\n' 以外的字符作为分隔符,都可能意味着 fgets() 将不再起作用。

为了清楚起见,您可能最好编写一个自定义函数来执行您想要的二进制输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2013-03-24
    相关资源
    最近更新 更多