在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(或更早)?
你是否愿意改变你的代码来处理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