在C中自动检测操作系统并处理它们的特定换行符

问题描述:

有没有办法检测C代码编译的操作系统,以便在文本文件中使用它的特定换行符处理?例如,我在Windows机器上编译我的代码,它应该使用\ r \ n作为文本文件中的换行符,在Linux上它应该只用\ n。在C中自动检测操作系统并处理它们的特定换行符

我需要这个程序,它应该读取文本文件的二进制文件,并与其他字符串匹配文件的子串。这应该适用于Windows和Linux。

感谢您的帮助!

+1

会[使用宏帮助](https://*.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor) ? – d125q 2014-11-23 14:15:27

+0

如果你只是在阅读文件;只是忽略(过滤掉)任何'\ r',只使用'\ n'(这也允许你读取Windows上的* nix文件和* nix上的Windows文件)。你只需要关心写文件(但是在那种情况下,通常你可以在阅读时自动检测,并且只需要写文件就可以)。 – Brendan 2014-11-23 14:21:12

+0

我想过使用宏,但它不是很舒服,因为然后我必须连接字符串,并且不能在字符串中使用\ n ... – Alex 2014-11-23 14:23:50

您不需要知道本机存储格式。当读取文件时,无法知道它是在Window,Linux还是其他系统上创建的 - 它可能是在另一个系统上创建的,而不是您正在使用的系统上创建的。当编写时,您的程序将为您的操作系统使用本机库,并输出它认为适合的任何内容(\n)。

读取文本文件行结束不可知归结为:

  1. 使用二进制模式,而不是“文本模式”(你似乎已经做到这一点)。
  2. 阅读文本,直到遇到\r\n
  3. 如果您收到\r,请跳过下一个\n;
  4. 如果您收到\n,请跳过下一个\r

这会为\n(Linux和其他类Unix操作系统如Mac OS X),类似于Windows \r\n及以上的Mac OS文件只\r结束行结束工作。这涵盖了您可能遇到的所有“正常”文本文件的大约99.99%。曾经有一个非常罕见的使用\r\n\n(或可能是\n\r\r),但即使这样也会正确处理。

+0

谢谢!这将有很大帮助 – Alex 2014-11-23 18:12:42

最好的方法是检查一个预定义宏和#ifdef。 您可以使用命令

gcc -dM -E - < /dev/null 

和grep为 “LINUX” 或 “WIN32” 打印所有的预定义宏

我希望找到_ LINUX _在Linux机器和_定义WIN32 _在windows机器上定义。