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

How to detect a line break in C++?

在windows中换行是

\r\n

在linux、

\n

我不想改变我的代码,当它运行在不同的地方时OS,我只想直接重新编译它。

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

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

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

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

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

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

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

  1. 扫描 \r\n
  2. 如果找到的 char 是 \r,则还要紧接着查找 \n。如果存在,则将其作为同一换行符的一部分使用。

此扫描程序将接受具有 CRLFCR+LF 行结尾的文件。它类似于许多编码检测更高级别字符串流所做的事情。

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

您需要封装在抽象中的平台相关细节。因此,只需提供简单的 class TextInfo (?) 并添加静态函数或 public 静态成员,这将 return 行结束。

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

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

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

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