mac上的fgets读取直到回车符'\ r'还是取决于新行'\ n'?
原因是我使用fgets一次读取一行文件。但是,如果它在一个只有'\ r'的mac文件上运行,那么它就无法完成我想要的行。 (在linux中运行)
我不想编写库类型函数来处理交叉兼容性问题。我可以使用另一种标准功能吗?
答案 0 :(得分:4)
如果您严格遵守C,则可以尝试使用getdelim()
,如果它在您的系统上可用。
答案 1 :(得分:3)
哦等等,我错过了“在Linux上运行”,“带有CR的mac文件”。
好的,答案是:fgets()
文档明确地将“换行符”称为行终止符。特别是Unix / Linux实现不可能听说过旧Mac的CR作为线路终结器的概念;所以fgets
没有看到那些CR作为行结束并不奇怪。
<强>更新强>
我强烈建议避免大部分问题,使用命令行实用程序(例如tr
)只是在将程序抛出之前翻译文件。
答案 2 :(得分:1)
您是在谈论MacOS X还是MacOS 9(或更早版本)?
答案 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