![](/img/trans.png)
[英]Read text lines using QDataStream or QTextStream or neither from tcpsocket?
[英]Checking total lines read by QTextStream without using a dedicated counter
我目前正在研究用於解析行數未知的文件的代碼。 格式大致如下:
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可以跳過多行,因此如果我手動進行計數,則無法使用它。
不幸的是,我還沒有找到一個好的解決方案。 最接近的是這樣的 ,但這是假設我們已經在一個簡單的循環中一次一步地瀏覽文件了。 同樣,在這種情況下,這太不切實際了。
所以...我想我的問題是:是否有一種優雅的方法可以在不依賴任何先前代碼的情況下檢查QTextStream指向的行號? 我是否缺少明顯的東西?
(我寧願避免在除Qt和基本C ++庫之外的其他庫上使用。)
我認為答案是否定的。 如果查看QTextStreamPrivate ,則沒有包含行數的成員字段。 類本身不需要它。
您也可以查看scan()
方法,該方法用於讀取行以獲取提示。
只是一個想法:如果可以使用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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.