fgets()linux vs mac

在Mac上的fgets读取直到回车'\ r'还是依赖于新行'\ n'?

原因是我正在使用fgets一次读取一行文件。 但是,如果它运行在一个只有'\ r'的行结束的mac文件,它不能做我想要的。 (在Linux中运行)

我不想编写库types的函数来处理交叉兼容性问题。 是否有另一个标准的function,我可以使用呢?

如果你严格遵守C语言,你可以尝试使用getdelim()如果你的系统可用的话getdelim()

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

好的,答案是: fgets()文档明确提到“换行符”作为行结束符。 特别是Unix / Linux的实现不能期望听到旧Mac的CR作为行终结符的概念; 所以这并不奇怪, fgets没有看到这些CR作为行结束。

更新:

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

你在谈论的MacOS X或MacOS 9(或更早)?

  • 在MacOS 9或更早的版本中,图书馆将停在'\ r'处。
  • 在MacOS X上,行结束符是'\ n',就像其他Unix系统一样。

你是否愿意改变你的代码来处理Mac风格的行尾? 你会永远不会处理正常的Unix线路结局? 或者你想要一个接受任一风格的函数? 这是不合理的。

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

当Mac从Mac OS 9移动到Mac OS X时,由于Mac OS X是建立在BSD之上的, \n是传统的换行符,所以行结尾约定从\r终止的行改变为\n 。 因此,即使在Mac上, fgets也会解析由\n划定的行,而不是\r

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

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

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