检查QTextStream读取的总行数,而不使用专用计数器

时间:2017-11-16 04:37:42

标签: c++ qt c++11

我目前正在处理用于解析具有未知行数的文件的代码。格式大致如下:

ShapeId: 1
ShapeType: Line
ShapeDimensions: 20, 90, 100, 20
PenColor: blue
PenWidth: 2
PenStyle: DashDotLine
PenCapStyle: FlatCap
PenJoinStyle: MiterJoin

// and so on and so forth; formats vary slightly depending on the entry

作为一个文本文件,显然我们想要检查错误。目前,我通过抛出(相当)信息性消息的异常来做到这一点。

但是,我的异常消息不能太具体,因为我的许多帮助解析文件的函数都过于通用而无法使用特定的消息。鉴于线条的多样性,为每种线路定制写入消息是不切实际的。

正如我在标题中提到的,我正在使用QTextStream。我正在使用readLine来读取每一行,然后使用该行进行操作。我也在使用skipWhiteSpace来跳过数据块之间的差距。

我希望QTextStream可以使用此功能,但它并不是。我能找到的最接近的是pos。这比没有好,但它不像行号那么有用。

当我逐步浏览每一行时,我可以添加一个整数计数器来计数。但是,这在我的程序环境中是不切实际的,我的程序中有许多辅助函数可以读取行。此外,skipWhiteSpace可以跳过多行,因此如果我手动计算,我就无法使用此行。

不幸的是,我还没能找到一个好的解决方案。最接近的类似于this,但是假设我们已经在一个简单的循环中逐步遍历文件,一次一行。同样,在这种情况下,这太不切实际了。

所以...我猜我的问题是:有没有一种优雅的方法来检查QTextStream指向的行号,而不依赖于任何以前的代码?我错过了一些明显的东西吗?

(我宁愿避免使用Qt以外的库和基本的C ++库。)

3 个答案:

答案 0 :(得分:1)

我认为答案是肯定的。如果查看QTextStreamPrivate,则没有包含行数的成员字段。班级本身并不需要它。

您还可以查看用于读取线条的scan()方法,以获取提示。

答案 1 :(得分:0)

只是一个想法:如果您可以使用QTextStream::pos()函数获取当前位置,则可以通过读取该位置之前的整个文本来计算行号,并计算该字符串中的新行字符。类似的东西:

qint64 currentPos = stream.pos();
QString str = stream.read(currentPos);
int lineNum = str.count(QRegExp("\\r\\n?|\\n")) + 1;

这可能很慢,但是您只需要用于错误报告的行号,因此只需调用一次即可。

答案 2 :(得分:0)

您可以将QTextStream包裹在计算行数的内容中。

class StreamWithLineCount
{
    QTextStream stream;
    int lineCount;
public:
    QString readLine(qint64 maxlen = 0)
    {
        ++lineCount;
        return stream.readLine(maxLen);
    }

    void skipWhitespace()
    {
         qint64 pos = stream.pos(); 
         while (!stream.atEnd() && readLine().simplified().isEmpty()) 
         {
             pos = stream.pos();
         }        
         seek(pos);
    }
}