获取c++ /Qt中特定于平台的行结束符

Get platform specific end of line character in C++/Qt

本文关键字:平台 结束 于平台 c++ Qt 获取      更新时间:2023-10-16

是否有任何平台获得正确的行尾符号?我的意思是,如果我想将EOL写入文件,我可以在Windows和Unix上使用n,但也有rn,如果我要在二进制数据中进行搜索,这将是重要的。

所以,在c#中我需要Environment.NewLine这样的东西,它应该是一些类,而不是#ifdef Q_OS_WIN32...

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

Try

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

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

  • 仅限CR (Mac)
  • CR +低频(赢得)
  • 低频(Unix)

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

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

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

当你阅读时,准备好以这些字符中的任何一个结束一行,但是如果你发现一个回车,检查它后面是否有换行,如果有,认为它是同一行的一部分。

我使用这段代码:

    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上将字符串分割成行。

您可以尝试使用std::endl