fgets在mac上是读取到回车符'\r'还是也依赖于换行符'\n'?
原因是我正在使用fgets每次读取一行文件。但是,如果它在只有'\r'作为行结尾的mac文件上运行,它将无法实现我想要的功能(在linux上运行)。
我不想编写处理跨平台兼容性问题的库类型函数。是否有另一个标准函数可以代替呢?
fgets在mac上是读取到回车符'\r'还是也依赖于换行符'\n'?
原因是我正在使用fgets每次读取一行文件。但是,如果它在只有'\r'作为行结尾的mac文件上运行,它将无法实现我想要的功能(在linux上运行)。
我不想编写处理跨平台兼容性问题的库类型函数。是否有另一个标准函数可以代替呢?
哦,等等,我错过了“在 Linux 上运行”和“带有CR的 Mac 文件”。
好的,答案是:fgets()
文档明确将“换行符”作为行终止符。特别是 Unix/Linux 实现不能期望知道旧的 Mac 的 CR 作为行终止符的概念;因此,fgets
不会将这些 CR 视为行结束也就不足为奇了。
更新:
我的强烈建议是避免大部分问题,使用像 tr
这样的命令行实用程序在将文件传递给程序之前将其转换。
如果你严格遵循C语言,可以尝试使用 getdelim()
函数(如果在你的系统上可用)。
你是在谈论MacOS X还是MacOS 9(或更早版本)?
你愿意改变你的代码来处理Mac风格的换行符吗?你永远不会处理正常的Unix换行符吗?还是你想要一个可以接受任何一种风格的函数?这是不合理的。
为什么不直接通过TR将所有可疑文件传输,将CR更改为LF,然后读取管道。无需创建其他文件。无论原始文件是否有CR,代码都将与标准fgets一起工作。
当Mac从Mac OS 9转移到Mac OS X时,行结束约定从以\r
结尾的行更改为\n
,因为Mac OS X是建立在BSD之上的,而在BSD中,\n
是传统的换行符。因此,即使在Mac上,fgets
也会解析由\n
分隔的行,而不是\r
。
我认为,如果您想解析由\r
分隔的行,则必须自己这样做,或者提前将文件转换为\n
行结束符。
Mac上的C库应该“做正确的事情”。
顺便提一下,Linux和Mac都使用\n作为行终止符,而不是\r。