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

How to detect a line break in C++?

本文关键字:C++ 换行符 检测 何检测      更新时间:2023-10-16

在窗口中,换行符为

rn

在 Linux 中,

n

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

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

您需要

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

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

#ifdef WINDOWS
return "rn";
#endif
#ifdef LINUX
return "n";
#endif

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

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

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

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

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

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

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

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

  1. 扫描rn
  2. 如果找到的字符是r,那么也要在它之后立即寻找n。如果存在,则将其用作同一换行符的一部分。

此扫描过程将接受行尾为 CRLFCR+LF 行尾的文件。它类似于许多编码检测更高级别字符串流的功能。

下面是另一个答案,它概述了istream代码中的此过程:获取 std :: ifstream 处理 LF、CR 和 CRLF?