我正在开发一个解析器。我想一个字符一个字符地解析文本文件。
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)
有没有一种简单的方法来归档它?谢谢。
发布于 2016-02-12 07:26:32
解析文本很快就变成了一件非常麻烦的事情。如果希望将两个字符的序列\ 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;
}发布于 2016-02-12 16:16:45
您是否期望QString fieldTerminator = "\n“长度为1个字符并包含‘行尾’?它不是这样工作的: fieldTerminator有两个字符:'\‘和'n';如果你想遵循printf()逻辑,你应该自己实现它(或者使用一些其他的字符串解析函数)
另外,如果我正确理解了解析器的逻辑,我会建议对参数fieldTerminator、lineTerminator、encloseChar使用QChar --这些应该是一个字符,而不是字符串。
发布于 2016-02-14 02:39:02
QChar strToChar(QString str)
{
QChar ret;
if(!str.isEmpty())
{
if(str.size() == 1)
ret = str.at(0);
else if(str.size() == 2 && str.startsWith('\\'))
{
// special char
QChar tmp = str.at(1);
if(tmp == '\'')
ret = '\'';
else if(tmp == '\"')
ret = '\"';
else if(tmp == '?')
ret = '\?';
else if(tmp == '\\')
ret = '\\';
else if(tmp == 'a')
ret = '\a';
else if(tmp == 'b')
ret = '\b';
else if(tmp == 'e')
ret = '\e';
else if(tmp == 'f')
ret = '\f';
else if(tmp == 'n')
ret = '\n';
else if(tmp == 'r')
ret = '\r';
else if(tmp == 't')
ret = '\t';
else if(tmp == 'v')
ret = '\v';
}
// hex, oct, unicode missing
}
return ret;
}这就是我现在使用的.但是我希望看到一个更好的实现。
https://stackoverflow.com/questions/35350801
复制相似问题