fgets()linux与mac

fgets()linux与mac,c,linux,macos,compatibility,stdio,C,Linux,Macos,Compatibility,Stdio,mac上的fgets是否一直读取,直到回车符返回'\r',还是取决于新行'\n' 原因是我使用FGET一次读取一行文件。但是,如果它在mac文件上运行,行尾只有'\r',则无法执行我想要的操作。(在linux中运行) 我不想编写库类型函数来处理交叉兼容性问题。还有其他标准函数可以替代吗?Mac上的C库应该“做正确的事情” 顺便说一句,Linux和Mac都使用\n作为行终止符,而不是\r您指的是MacOS X或MacOS 9(或更早版本) 在MacOS 9或更早版本上,库将在“\r”处停止 在M

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

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


我不想编写库类型函数来处理交叉兼容性问题。还有其他标准函数可以替代吗?

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


顺便说一句,Linux和Mac都使用\n作为行终止符,而不是\r

您指的是MacOS X或MacOS 9(或更早版本)

  • 在MacOS 9或更早版本上,库将在“\r”处停止
  • 在MacOS X上,行终止符是“\n”,就像在任何其他Unix系统中一样
哦,等等,我错过了“在linux上运行”和“一个mac文件有CR”

好的,答案是:
fgets()
文档明确地将“换行符”作为行终止符。尤其是Unix/Linux实现不能指望听说旧Mac将CR作为线路终止器的概念;因此,
fgets
不将这些CRs视为行结束并不奇怪

更新:


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

如果严格遵守C,如果系统上有可用的代码,您可以尝试使用。

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


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

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


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

是否以文本模式打开文件?在Linux下阅读,因此没有可用的文本模式。自从许多人创建具有\r行结尾的文件以来,已经将近10年了。也许你应该转换文件并完成它。创建文件的powerpc版本程序是从1999年开始的。这是一个游戏,我无法修补;)程序没有在Mac上运行,而且文件显然有CRs,不管它来自哪里。哈!我没有意识到mac从CR切换到LF,但他们确实做到了。@Anacrolix-mac从OSX(基于达尔文的版本)开始切换到LF。这与他的程序在Linux下运行无关。技巧问题;)是的,我明白了……哦,好吧(事实上,第一段或第一个问题是关于Mac上的fgets()。然后,关于在Linux上读取Mac文件的问题会有一个改变。如果它来自MacOS X Mac,那么它将包含换行符,而不是回车符。因为它随后提到fgets())在Linux上,它的行为并不像预期的那样——它会询问是否有fgets()以外的函数可以替代。没有真正的标准替代方法——getdelim()的GNU C库替代方法对于Linux来说是合理的,但不是跨平台的。我想你会赢的,+1。我认为最好的选择,如果mac没有GnuC,那就太糟糕了,或者他可以想出一个更好的补丁。