如何检测C++中的换行符
How to detect a line break in C++?
在窗口中,换行符为
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之间移动文件,你应该没问题。
但是,在许多情况下,您必须从两个编译的程序中读取这两个约定。这在各种文档和某些网络协议中都很常见。如果是这种情况,我建议以下过程:
- 扫描
r
或n
。 - 如果找到的字符是
r
,那么也要在它之后立即寻找n
。如果存在,则将其用作同一换行符的一部分。
此扫描过程将接受行尾为 CR
、LF
和 CR+LF
行尾的文件。它类似于许多编码检测更高级别字符串流的功能。
下面是另一个答案,它概述了istream
代码中的此过程:获取 std :: ifstream 处理 LF、CR 和 CRLF?
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 在字符串中输入换行符
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- C++ 换行符上的合并排序错误中断
- 在 std::string 的末尾插入换行符
- 连接两个文件时如何避免冗余尾随换行符?