确定平台线分隔符的便携式方法

问题描述 投票:0回答:2

不同的平台使用不同的行分隔符方案(LF、CR-LF、CR、NEL、Unicode LINE SEPARATOR 等)。 C++(和 C)运行时库通过在

'\n'
与目标平台的本机新行编码之间进行转换,使大部分操作对大多数程序来说都是透明的。 但如果您的程序需要确定实际使用的字节序列,您如何才能做到可移植呢?

我想出的最好方法是:

  1. 以文本模式编写一个临时文件,其中只有
    '\n'
    ,让运行时进行翻译。
  2. 以二进制模式读回临时文件以查看实际字节。

这感觉很笨拙。 有没有办法不用临时文件就可以做到这一点? 我尝试了 stringstreams,但运行时实际上并没有在该上下文中翻译

'\n'
(这是有道理的)。 运行时是否以其他方式公开此信息?

c++ newline
2个回答
7
投票

我不是 C/C++ 专家,但标准库中似乎没有任何内容可以直接为您提供行分隔符。翻译由文本模式文件函数透明地处理。

即使您觉得您的方法很“笨拙”,但它可能是最简单和最可靠的,因为您实际上正在测试使用和写出的行分隔符。并且是可移植的,因为您使用标准库函数来写入和读取文件。


0
投票

有时您将在幕后保证实施,有时则不然。除非文本的处理完全超出了程序的范围,否则必须not假设始终会处理此类翻译。

尤其是当您必须在自己的代码中插入或检测额外的换行符并且需要知道实际值时,尤其如此。随着您优化代码并添加多语言支持或正则表达式等功能,它将变得越来越重要。

如果您足够幸运能够使用 Qt,您可能可以访问 QTextStream,该 QTextStream 可以使用 QTextStream::endl() 方法。

示例:

QString str;
{ QTextStream tsTmp(&str); tsTmp << endl; } /* use braces to localize tsTmp */

如果不这样做,您将不得不在您期望的已定义符号上使用#ifdef,它们有很多,因此您需要找到您的构建系统正在使用的任何内容(

__linux__
_WIN32
Q_OS_<name*>
) ,仅举几个几个)。

如果您仅限于小型且裸露的构建环境,我想您可能能够使用 ios 库 做类似的事情。

如果您使用自己的构建系统,请务必探测此类内容,尽管我强烈建议您使用一些标准化的记录良好的构建系统,它可能会为您提供这些符号。你最终会像这样使用它们:

#ifdef _THIS_OS
#define NEWLINE THIS_OS_NEWLINE_CHAR
#endif
#ifdef _THAT_OS
#define NEWLINE THAT_OS_NEWLINE_CHAR
#endif

/* Now you know why so many programs have miles of #ifdef pragmas!
   Some build systems *may* allow #elif, but I'd stay away from that
   especially if you plan to ever migrate your code or offer it on other build systems.
*/

*注意:

Q_OS_names
很多,请查看Qt文档中的整个列表

© www.soinside.com 2019 - 2024. All rights reserved.