如何检测 C++ 中的换行符?
How to detect a line break in C++?
在windows中换行是
\r\n
在linux、
\n
我不想改变我的代码,当它运行在不同的地方时OS,我只想直接重新编译它。
那么在C++中如何检测呢?标准库是否定义了常量或函数来检测它?
您不应该更改您的代码。每个实现都会正确处理它自己的行结尾。
如果每个平台都读取和写入其自己的 文件,它将正常工作。
唯一的问题是,如果您将 Windows 风格的 数据文件 传输到 UNIX,反之亦然。如果 那是 你正在做的事情,你可以简单地修改你读入的字符串,以便删除末尾的任何 \r
字符。
请注意,不会对Windows风格的文件产生不利影响,因为在内存中,它们没有 \r
- 它只在写入时放入文件。
如果您不在 Windows/Linux 之间移动文件,应该没问题。
但是,在许多情况下,您必须从两个已编译的程序中阅读这两个约定。这在各种文档和一些网络协议中很常见。如果是这种情况,我推荐以下程序:
- 扫描
\r
或 \n
。
- 如果找到的 char 是
\r
,则还要紧接着查找 \n
。如果存在,则将其作为同一换行符的一部分使用。
此扫描程序将接受具有 CR
、LF
和 CR+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
这对两个系统都适用。您可以随时添加其他系统。
在windows中换行是
\r\n
在linux、
\n
我不想改变我的代码,当它运行在不同的地方时OS,我只想直接重新编译它。
那么在C++中如何检测呢?标准库是否定义了常量或函数来检测它?
您不应该更改您的代码。每个实现都会正确处理它自己的行结尾。
如果每个平台都读取和写入其自己的 文件,它将正常工作。
唯一的问题是,如果您将 Windows 风格的 数据文件 传输到 UNIX,反之亦然。如果 那是 你正在做的事情,你可以简单地修改你读入的字符串,以便删除末尾的任何 \r
字符。
请注意,不会对Windows风格的文件产生不利影响,因为在内存中,它们没有 \r
- 它只在写入时放入文件。
如果您不在 Windows/Linux 之间移动文件,应该没问题。
但是,在许多情况下,您必须从两个已编译的程序中阅读这两个约定。这在各种文档和一些网络协议中很常见。如果是这种情况,我推荐以下程序:
- 扫描
\r
或\n
。 - 如果找到的 char 是
\r
,则还要紧接着查找\n
。如果存在,则将其作为同一换行符的一部分使用。
此扫描程序将接受具有 CR
、LF
和 CR+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
这对两个系统都适用。您可以随时添加其他系统。