3

mac 上的 fgets 是否会读取到回车符 '\r' 或者它是否也取决于新行 '\n'?

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

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

4

6 回答 6

4

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

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

更新:

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

于 2010-01-14T00:29:33.423 回答
4

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

于 2010-01-14T00:37:58.850 回答
1

您是在谈论 MacOS X 还是 MacOS 9(或更早版本)?

  • 在 MacOS 9 或更早版本上,库将在“\r”处停止。
  • 在 MacOS X 上,行终止符是 '\n',就像在任何其他 Unix 系统中一样。
于 2010-01-14T00:28:36.187 回答
1

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

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

于 2010-01-14T00:43:33.810 回答
1

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

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

于 2010-01-14T01:22:45.247 回答
0

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

BTW Linux 和 Mac 都使用 \n 作为行终止符,而不是 \r

于 2010-01-14T00:26:24.030 回答