fgets()在Linux和Mac中的区别

3

fgets在mac上是读取到回车符'\r'还是也依赖于换行符'\n'?

原因是我正在使用fgets每次读取一行文件。但是,如果它在只有'\r'作为行结尾的mac文件上运行,它将无法实现我想要的功能(在linux上运行)。

我不想编写处理跨平台兼容性问题的库类型函数。是否有另一个标准函数可以代替呢?


1
你是以文本模式打开文件的吗? - Anon.
1
由于在Linux下阅读,因此没有文本模式可用。 - Carl Smotricz
自从许多人使用\r作为行尾标识符创建文件以来,已经过去了将近10年。也许你应该转换这些文件并完成它。 - Potatoswatter
2
创建这些文件的PowerPC版本程序是从1999年开始的。它是一个游戏,我无法修补它 ;) - Tanj
6个回答

4

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

好的,答案是:fgets() 文档明确将“换行符”作为行终止符。特别是 Unix/Linux 实现不能期望知道旧的 Mac 的 CR 作为行终止符的概念;因此,fgets 不会将这些 CR 视为行结束也就不足为奇了。

更新:

我的强烈建议是避免大部分问题,使用像 tr 这样的命令行实用程序在将文件传递给程序之前将其转换。


4

如果你严格遵循C语言,可以尝试使用 getdelim() 函数(如果在你的系统上可用)。


我认为最好的选择是,如果那个Mac用户没有GnuC,那就太糟糕了,他可以提出更好的修补程序。 - Tanj

1

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

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

不相关,因为他的程序正在Linux下运行。恶作剧问题 ;) - Carl Smotricz
是的 - 我明白了...哦,好吧... :( 实际上,第一个段落或问题是关于在Mac上使用fgets()。然后转而询问如何在Linux上读取Mac文件。如果它来自MacOS X Mac,则会包含换行符而不是回车符。由于随后提到Linux上的fgets()表现不如预期,并询问是否有其他函数可以代替fgets()。并没有真正标准的替代方案 - GNU C库的getdelim()替代方案对于Linux来说是合理的,但不跨平台。 - Jonathan Leffler

1

你愿意改变你的代码来处理Mac风格的换行符吗?你永远不会处理正常的Unix换行符吗?还是你想要一个可以接受任何一种风格的函数?这是不合理的。

为什么不直接通过TR将所有可疑文件传输,将CR更改为LF,然后读取管道。无需创建其他文件。无论原始文件是否有CR,代码都将与标准fgets一起工作。


1

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

我认为,如果您想解析由\r分隔的行,则必须自己这样做,或者提前将文件转换为\n行结束符。


我认为你会赢得这个赌注,+1。 - Carl Smotricz

0

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

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


程序在Mac上无法运行,而且无论文件来自何处,该文件似乎都有CR。 - Carl Smotricz
哈!我没有意识到Mac从CR转换为LF,但他们确实这样做了。 - Matt Joiner
@Anacrolix - 自从基于Darwin的OS X版本推出以来,Mac已经切换到LF。 - R Samuel Klatchko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接