我正在研究解析器。我想逐个字符地解析文本文件。
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/