mac 上的 fgets 是否会读取到回车符 '\r' 或者它是否也取决于新行 '\n'?
原因是我使用 fgets 一次读取一行文件。但是,如果它在一个 mac 文件上运行,并且行尾只有 '\r',它就无法执行我想要的操作。(在linux中运行)
我不想编写库类型函数来处理交叉兼容性问题。我可以使用另一个标准功能吗?
mac 上的 fgets 是否会读取到回车符 '\r' 或者它是否也取决于新行 '\n'?
原因是我使用 fgets 一次读取一行文件。但是,如果它在一个 mac 文件上运行,并且行尾只有 '\r',它就无法执行我想要的操作。(在linux中运行)
我不想编写库类型函数来处理交叉兼容性问题。我可以使用另一个标准功能吗?
哦等等,我错过了“在 linux 上运行”和“具有 CR 的 mac 文件”。
好的,答案是:fgets()
文档明确将“换行符”称为行终止符。尤其是 Unix/Linux 实现不能指望听说过旧 Mac 的 CR 作为行终止符的概念;fgets
因此,将这些 CR 视为行尾也就不足为奇了。
更新:
我强烈建议避免大多数问题是使用命令行实用程序,例如tr
在将程序扔给它之前翻译文件。
如果您严格遵守 C,您可以尝试使用getdelim()
它(如果它在您的系统上可用)。
您是在谈论 MacOS X 还是 MacOS 9(或更早版本)?
你愿意为了处理 Mac 风格的行尾而改变你的代码吗?你永远不会处理正常的 Unix 行尾吗?或者你想要一个接受任何一种风格的函数?这是不合理的。
为什么不通过 TR 将所有有问题的文件通过管道传输以将 CR 更改为 LF,然后读取管道。无需创建其他文件。无论原始文件是否有 CR,代码都可以使用标准 fget。
当 Mac 从 Mac OS 9 迁移到 Mac OS X 时,行结束约定从以 结尾的行更改\r
为\n
,因为 Mac OS X 构建在 BSD 之上,其中\n
是传统的换行符。因此,即使在 Mac 上,也将解析由,而不是fgets
分隔的行。\n
\r
我相信如果你想解析由 分隔的行\r
,你将不得不自己这样做,或者\n
提前将文件转换为行尾。
Mac 上的 C 库应该“做正确的事”。
BTW Linux 和 Mac 都使用 \n 作为行终止符,而不是 \r