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