fgets()linux vs mac

时间:2010-01-14 00:16:27

标签: c linux macos compatibility stdio

mac上的fgets读取直到回车符'\ r'还是取决于新行'\ n'?

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

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

好的,答案是:fgets()文档明确地将“换行符”称为行终止符。特别是Unix / Linux实现不可能听说过旧Mac的CR作为线路终结器的概念;所以fgets没有看到那些CR作为行结束并不奇怪。

<强>更新

我强烈建议避免大部分问题,使用命令行实用程序(例如tr)只是在将程序抛出之前翻译文件。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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