如何在C ++中检测换行符?

时间:2015-04-09 06:44:49

标签: c++ c++-standard-library

在Windows中,换行符是

\r\n

在linux中,

\n

我不想在不同操作系统中运行时更改我的代码,我只是想直接重新编译它。

那么如何在C ++中检测它呢?标准库是否定义了常量或函数来检测它?

3 个答案:

答案 0 :(得分:1)

您不应 更改代码。每个实现都将正确处理它自己的行结尾。

如果每个平台都读取和写入自己的文件,它将正常工作。

唯一的问题是,如果将Windows样式的数据文件传输到UNIX,反之亦然。如果那是您正在做的事情,您可以简单地修改您读入的字符串,以便删除末尾的任何\r字符。

请注意,不会对Windows风格的文件产生负面影响,因为在内存中,它们 \r - 它只会放入写作时的文件。

答案 1 :(得分:1)

如果您不在Windows / Linux之间移动文件,那么您应该没问题。

但是,在许多情况下,您必须从两个编译的程序中读取这两个约定。这在各种文档和一些网络协议中很常见。如果是这种情况,我建议采用以下程序:

  1. 正在扫描\r\n
  2. 如果找到的字符为\r,则也会在其后立即查找\n。如果存在,则将其作为同一换行符的一部分使用。
  3. 此扫描程序将接受包含CRLFCR+LF行结尾的文件。它类似于许多编码检测更高级别的字符串流所做的事情。

    这是另一个答案,它在istream的代码中概述了此过程: Getting std :: ifstream to handle LF, CR, and CRLF?

答案 2 :(得分:0)

需要封装在抽象中的平台相关详细信息。所以只需提供简单的类TextInfo(?)并添加静态函数或公共静态成员,它将返回行结尾。

在此函数中,您可以使用预处理器定义通过条件编译添加特定于平台的代码。

#ifdef WINDOWS
return "\r\n";
#endif
#ifdef LINUX
return "\n";
#endif

现在你只需要提供不同的目标编辑(可能你已经有了)。对于目标,您需要再添加一个define来编译命令(-D表示gcc,/ D表示VS)。

然后在代码中,您可以使用TextInfo,这对两个系统都可以正常工作。您可以随时添加其他系统。