2010-06-08 26 views
1

下面的代碼是用來從QFile中查找讀取字節數的。對於某些文件,它會提供正確的文件大小,但對於某些文件,它會給我一個近似fileCSV.size()/ 2的值。我發送兩個文件的字符數相同,但文件大小不同link text。我是否應該使用其他對象來閱讀QFile?如何獲取從QTextStream中讀取的字節數

QFile fileCSV("someFile.txt"); 
if (!fileCSV.open(QIODevice::ReadOnly | QIODevice::Text)) 
    emit errorOccurredReadingCSV(this); 
QTextStream textStreamCSV(&fileCSV);  // use a text stream 
int fileCSVSize = fileCSV.size()); 
qint64 reconstructedCSVFileSize = 0; 
while (!textStreamCSV.atEnd()) 
{ 
    QString line = textStreamCSV.readLine();   // line of text excluding '\n' 
    if (!line.isEmpty()) 
    { 
     reconstructedCSVFileSize += line.size(); //this doesn't work always 
     reconstructedCSVFileSize += 2; 
     } 
    else 
     reconstructedCSVFileSize += 2; 
} 

我知道讀取QString的大小是錯誤的,如果可以的話,給我一些其他的解決方案。

謝謝。

回答

3

我想這是因爲QString::size()返回的字符數。如果您的文本文件採用UTF16格式,例如x字節長,則這將與x/2個字符對應。

編輯:如果您想知道讀取行的確切大小,您可以使用QFile::readLine()。這將返回一個QByteArray,其中的字節數可以使用size()來查詢。

+0

我的代碼正在工作的一半;)。 我需要一些方法來讀取字節數。如果您知道其他方法來實現這一點,請回復。謝謝。 – user261882 2010-06-08 14:14:00

+0

QFile :: size()有什麼問題?如果您想訪問文件中的原始字節,請使用QDataStream而不是QTextStream。 – Job 2010-06-08 14:20:16

+0

QFile :: size()沒有錯,每次都會給出正確的文件大小。問題是我不知道如何獲取從文件讀取的字節數,我將逐行讀取文件。 我會閱讀關於QDataStream的想法... – user261882 2010-06-08 14:24:56

0

我用QByteArray做了一個解決方案。解決辦法是:

QFile fileCSV("someFile.txt"); 
if (!fileCSV.open(QIODevice::ReadOnly | QIODevice::Text)) 
    emit errorOccurredReadingCSV(this); 
while (!fileCSV.atEnd()) 
{  
    QByteArray arrayCSV = fileCSV.readLine(); 
    reconstructedCSVFileSize += arrayCSV.size(); 
    QTextStream textStreamCSV(arrayCSV); 
    QString line = textStreamCSV.readLine(); 
} 

但是有個問題。關閉我發送的文件files2.zip

當我用這種方法讀取largerFile.csv時,第一行被正確讀取,字符串的大小爲108,字符數也爲108. arrayCSV.size()返回的數字爲221。 當我讀第二行時,字符串的大小是50,但字符數是25. arrayCSV.size()返回的數字是51.當我用debuger打開字符串時,字符串是空的,雖然它的大小是50.我想這是因爲第一行是用一種編碼寫的,而另一種是用不同的編碼寫的,導致QTextStream行爲不正常。

當我閱讀smallerFile.csv時,一切都很好。字符串的大小是16,字符數也是16(沒有\ n字符)。 arrayCSV.size()返回的數字爲18. 第二行也正確讀取。字符串的大小是25,字符數也是25. arrayCSV.size()返回的數字是25.

我發佈的第一個代碼從兩個文件中正確讀取字符串。

0

還有一個類似的問題:QTextStream behavior searching for a string not as expected 。你可以檢查我的答案。

簡而言之:要做正確的計算,你應該在用pos()讀取後用pos()和行尾標記開始行。像這樣:

qint64 newFileSize = 0; 
while (!f.atEnd()) 
{ 
    const qint64 begin = f.pos(); 
    const QString line = f.readLine(); 
    const qint64 end = f.pos(); 
    // TODO: some your actions 
    // ... 
    const qint64 realLengthOfLine = end - begin; 
    newFileSize += realLengthOfLine; 
} 
相關問題