在C ++ / Qt中获取特定于平台的行尾字符

时间:2014-08-08 15:18:13

标签: c++ qt cross-platform

是否有任何东西可以为任何平台获得正确的行尾符号?我的意思是,如果我想将EOL写入文件,我可以使用\n用于Windows和Unix,但是还有\r\n,如果我要搜索二进制数据,这将是很重要的。

所以,我需要在C#中使用类似Environment.NewLine的内容,它应该是某个类而不是#ifdef Q_OS_WIN32...的技巧。

用例是从QTextStream读取所有数据并将其拆分为新行。无论如何,如果QTextStreamQString::split足够聪明,可以在任何平台上正确处理\n,我想知道我问过的事情。

4 个答案:

答案 0 :(得分:2)

尝试

QString::split(QRegularExpression{R"-((\r\n?|\n))-"})

这使用C ++ 11原始字符串文字来创建一个匹配所有三种可能性的正则表达式:

  • 仅限CR(Mac)
  • CR + LF(Win)
  • LF(Unix)

如果你不能使用C ++ 11,则必须手动转义正则表达式:

"(\\r\\n?|\\n)"

这应该可以解决问题。

答案 1 :(得分:1)

在文本模式下编写文件时,应将“\ n”字符重新解释为适合该系统的任何内容。对于Windows,这意味着CRLF(回车,换行),在Unix上,它只是LF,而Macintosh标准本身就是CR。

当你正在阅读时,准备好在这些字符中的任何一个字符处结束一行,但如果你找到回车符,请检查它后面是否有换行符,如果有,请考虑它的一部分同一条线。

答案 2 :(得分:0)

您可以尝试使用std :: endl

答案 3 :(得分:0)

我使用以下代码:

    const QChar newline(QChar('\n'));
    const QChar cr('\r');
    #ifdef __linux__ 
        const QChar eol = newline);
    #elif _WIN32
        const QString eol = QString(cr) + QString(newline);
    #else
        const QChar eol = cr;
    #endif

我没有测试过else分支,因为我在非Linux或Windows(例如Mac)系统上所做的工作很少,所以必须测试一下自己。

Linux和Windows分支对我来说很好,可以将字符串在Windows和Linux上拆分为行。