c++ - qstring 到 qchar 特殊字符

标签 c++ qt qstring

我正在研究解析器。我想逐个字符地解析文本文件。

bool parse(QString fileName,
           QString fieldTerminator,
           QString lineTerminator,
           QString encloseChar)
{
    QChar ft = *(fieldTerminator.unicode());
    QChar lt = *(lineTerminator.unicode());
    QChar ec = *(encloseChar.unicode());

    QFile file(fileName);

    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << file.errorString();
        return false;
    }

    QTextStream inStream(&file);

    while(!inStream.atEnd())
    {
        QChar c;
        inStream >> c;

        if(c == ft)
            qDebug() << "fieldterm";
        else if(c == lt)
            qDebug() << "lineterm";
        else if(c == ec)
            qDebug() << "encloseChar";
    }

    return true;
}

我在将 fieldTerminator 等转换为特殊字符 (QChar::SpecialCharacter) 时遇到问题。

例如:如果我将 fieldTerminator = "\n" 传递给函数,ft = '\' (92)

有没有简单的方法来归档它?谢谢。

最佳答案

解析文本很快就变成了有状态的事情。如果要将两个字符序列 \ n 识别为换行符 \n,则比较单个字符 (c = = ft) 是不够的。您可以记住前一个字符并检查当前和前一个字符。

QString parse(QString const& text)
{
    static QChar BACKSLASH('\\');
    static QByteArray const SPECIAL_CHARS ("\"'?abfnrtv");
    static QString    const SPECIAL_QCHARS ("\\\"\'\?\a\b\f\n\r\t\v") ;

    QString result;
    QChar prev;

     for( int i = 0; i < text.size(); ++i)
     {
        QChar c = text[i];

        if( prev == BACKSLASH )
        {
            int idx = SPECIAL_CHARS.indexOf( c );
            if( idx != -1)
            {
                result.append( SPECIAL_QCHARS[idx] );
            }
            else
            {
               result.append( prev );
               result.append( c );
            }
            prev = 0;
        }
        else
        {
           result.append( c );
           prev = c;
        }
    }

    return result;
}

关于c++ - qstring 到 qchar 特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350801/

相关文章:

c++ - 带有 Bison 和 Lex 的 Makefile

QtLinguist : Define a single context

C++ Qt QString 用一个替换双反斜杠

qt - 使用 clang 和 lld 生成 .map 文件

c++ - 如何将八位字节转换为 QString?

c++ - 如何在多行上编写 QString?

c++ - 无法使用指针打印二维矩阵的值

C++函数指针返回类型

c++ - 与其他几个具有相同输入的编译器相比,在 Xcode 中编译的代码给出了不正确的(?)输入

c++ - 使用嵌套类创建到 cpp 类对象的 qml 连接