【问题标题】:fgets() linux vs macfgets() linux vs mac
【发布时间】:2010-01-14 00:16:27
【问题描述】:

Mac 上的 fgets 是否会一直读取到回车符 '\r' 或者它是否也依赖于新行 '\n'?

原因是我使用 fgets 一次读取文件一行。但是,如果它在一个 mac 文件上运行,并且行尾只有 '\r',它就无法执行我想要的操作。 (在linux中运行)

我不想编写库类型函数来处理交叉兼容性问题。我可以使用其他标准函数吗?

【问题讨论】:

  • 您是否以文本模式打开文件?
  • 在 Linux 下阅读,因此没有可用的文本模式。
  • 自从许多人创建带有 \r 行尾的文件以来,已经快 10 年了。也许你应该转换文件并完成它。
  • 创建文件的 powerpc 版本程序是 1999 年的。这是一个游戏,我无法修补它;)

标签: c linux macos compatibility stdio


【解决方案1】:

如果您严格遵守 C,您可以尝试使用 getdelim()(如果您的系统上可用)。

【讨论】:

  • 我认为最好的选择,如果 mac 家伙没有 GnuC 那就太糟糕了,或者他可以想出一个更好的补丁。
【解决方案2】:

哦,等等,我错过了“在 linux 上运行”和“具有 CR 的 mac 文件”。

好的,答案是:fgets() 文档明确将“换行符”称为行终止符。尤其是 Unix/Linux 实现不能指望听说过旧 Mac 的 CR 作为行终止符的概念;因此fgets 没有将这些 CR 视为行尾也就不足为奇了。

更新:

为了避免大部分问题,我强烈建议使用命令行实用程序,例如 tr,在您将程序扔给它之前翻译文件。

【讨论】:

    【解决方案3】:

    您说的是 MacOS X 还是 MacOS 9(或更早版本)?

    • 在 MacOS 9 或更早版本上,库将停止在“\r”处。
    • 在 MacOS X 上,行终止符是 '\n',就像在任何其他 Unix 系统中一样。

    【讨论】:

    • 不相关,因为他的程序在 Linux 下运行。技巧问题;)
    • 是的 - 所以我明白了......哦,好吧...... :( 嗯,实际上,第一段或问题是关于 Mac 上的 fgets() 。然后有一个改变要问关于在 Linux 上读取 Mac 文件。如果它来自 MacOS X Mac,那么它将包含换行符而不是回车符。因为它随后提到 Linux 上的 fgets() 的行为不符合预期 - 并询问是否有一些功能除了可以使用 fgets() 之外。没有真正标准的替代方案 - getdelim() 的 GNU C 库替代方案对于 Linux 来说是合理的,但不是跨平台的。
    【解决方案4】:

    您是否愿意仅仅为了处理 Mac 风格的行尾而更改您的代码?你永远不会处理正常的 Unix 行尾吗?或者你想要一个接受任何一种风格的函数?这不合理。

    为什么不通过 TR 将所有有问题的文件通过管道将 CR 更改为 LF,然后读取管道。无需创建其他文件。无论原始文件是否有 CR,代码都可以使用标准 fget。

    【讨论】:

      【解决方案5】:

      当 Mac 从 Mac OS 9 迁移到 Mac OS X 时,行结束约定从以 \r 结尾的行更改为 \n,因为 Mac OS X 构建在 BSD 之上,其中 \n 是传统的换行符。因此,即使在 Mac 上,fgets 也会解析由\n 分隔的行,而不是\r

      我相信如果你想解析\r分隔的行,你必须自己做,或者提前将文件转换为\n行尾。

      【讨论】:

      • 我认为你会赢得那个赌注,+1。
      【解决方案6】:

      Mac 上的 C 库应该“做正确的事”。

      顺便说一句,Linux 和 Mac 都使用 \n 作为行终止符,而不是 \r

      【讨论】:

      • 程序没有在 Mac 上运行,而且文件显然有 CR,不管它来自哪里。
      • 哈!我没有意识到 mac 从 CR 切换到 LF,但他们做到了。
      • @Anacrolix - Mac 从 OS X(基于 Darwin 的版本)开始切换到 LF。
      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多