C++ 在不使用专用计数器的情况下检查QTextStream读取的总行数
我目前正在编写代码,用于解析具有未知行数的文件。格式大致如下:C++ 在不使用专用计数器的情况下检查QTextStream读取的总行数,c++,qt,c++11,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 t
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所指向的行号,而不依赖于之前的任何代码?我错过了什么明显的东西吗
(我宁愿避免使用Qt以外的库,也不使用基本的C++库)。
< P>我认为答案是否定的。如果你看进去,没有包含行计数的成员字段。类本身不需要它您还可以查看用于读取行的方法以获取提示。这只是一个想法:如果您可以使用
QTextStream::pos()
函数获取当前位置,您可以通过读取该位置之前的整个文本并计算该字符串中的新行字符来计算行号。比如:
qint64 currentPos = stream.pos();
QString str = stream.read(currentPos);
int lineNum = str.count(QRegExp("\\r\\n?|\\n")) + 1;
这可能会很慢,但是您只需要用于错误报告的行号,所以只需调用一次就可以了。您可以将
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);
}
}
这非常有效,除了我需要1)将流重置为开始(使用
stream.seek(0)
),以及2)不在最后一行添加一个。(我认为这在某些操作系统上可能是必要的)否则,它适合我的需要,是一个优雅的解决方案。谢谢