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

在C中自动检测操作系统并处理其特定的换行符,c,linux,windows,text-files,newline,C,Linux,Windows,Text Files,Newline,有没有一种方法可以检测操作系统,其中C代码被编译以处理文本文件中的特定换行字符?例如,我在Windows计算机上编译代码,它应该使用\r\n作为文本文件中的换行符,在Linux上它应该只使用\r\n 我需要一个程序,它应该读取二进制文本文件,并将文件的子字符串与其他字符串匹配。这应该可以在windows和Linux上运行 谢谢你的帮助 最好的方法是检查预定义的宏和#ifdef。 可以使用命令打印所有预定义的宏 gcc -dM -E - < /dev/null gcc-dM-E-

有没有一种方法可以检测操作系统,其中C代码被编译以处理文本文件中的特定换行字符?例如,我在Windows计算机上编译代码,它应该使用\r\n作为文本文件中的换行符,在Linux上它应该只使用\r\n

我需要一个程序,它应该读取二进制文本文件,并将文件的子字符串与其他字符串匹配。这应该可以在windows和Linux上运行


谢谢你的帮助

最好的方法是检查预定义的宏和#ifdef。 可以使用命令打印所有预定义的宏

gcc -dM -E - < /dev/null
gcc-dM-E-
和grep代表“LINUX”或“WIN32”


我希望找到在LINUX机器上定义的LINUX,以及在windows机器上定义的WIN32。

您不需要知道本机存储格式。读取文件时,您无法知道它是否是在Windows、Linux或其他系统上创建的——它可能是在您正在使用的系统之外的其他系统上创建的。编写时,程序将使用操作系统的本机库,并输出它认为适合
\n
的任何内容

读取以不可知结尾的文本文件行可归结为:

  • 使用二进制模式而不是“文本模式”(您似乎已经这样做了)
  • 阅读文本,直到遇到
    \r
    \n
  • 如果收到
    \r
    ,请跳过所有下一步
    \n
  • 如果收到
    \n
    ,请跳过所有下一步
    \r

  • 这将适用于
    \n
    (Linux和其他类似Unix的操作系统,如Mac OS X)、类似Windows的
    \r\n
    和仅以
    \r
    结尾的旧Mac OS文件的行结尾。这涵盖了您可能遇到的所有“正常”文本文件的99.99%。过去有一种非常罕见的方法使用
    \r\n\n
    (或者可能是
    \n\r\r
    ),但即使是这样也能正确处理。

    如果你只是在读取文件;只需忽略(过滤掉)任何
    \r
    ,只使用
    \n
    (这也允许您在Windows上读取*nix文件,在*nix上读取Windows文件)。您只需要关心写入文件(但在这种情况下,通常您可以在读取时自动检测,并在写入时执行相同的操作)。我曾考虑过使用宏,但这不是很舒服,因为这样我必须连接字符串,不能在字符串中使用\n…谢谢brendan,这可能是解决方案谢谢!这将有很大帮助