如何从QTextStream中获取字节数

时间:2010-06-08 13:58:13

标签: c++ qt unicode unicode-string

以下代码用于查找QFile的读取字节数。对于某些文件,它提供了正确的文件大小,但是对于某些文件,它给出了一个近似为fileCSV.size()/ 2的值。我发送的两个文件中包含相同数量的字符,但文件大小不同link text。我应该使用其他一些对象来阅读QFile吗?

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 个答案:

答案 0 :(得分:3)

我想是因为QString::size()返回了字符数。如果你的文本文件是UTF16,比如说x字节长,那么这将与x / 2个字符相对应。

编辑:如果您想知道读取线的确切大小,可以使用QFile::readLine()。这将返回QByteArray,其中size()可以使用{{1}}查询字节数。

答案 1 :(得分: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

当我使用这种方法读取greaterFile.csv时,第一行被正确读取,字符串的大小为108,字符数也是108. arrayCSV.size()返回的数字是221。 当我读第二行时,字符串的大小为50,但字符数为25. arrayCSV.size()返回的数字为51.当我用debuger打开字符串时,字符串为空,尽管它的大小是50.我猜这种行为是因为第一行是用一种编码写的,而另一种是用不同的编码写的,导致QTextStream表现不正常。

当我正在阅读tinyFile.csv时,一切正常。字符串的大小为16,字符数也是16(没有\ n字符)。 arrayCSV.size()返回的数字是18。 第二行也正确读取。字符串的大小为25,字符数也为25. arrayCSV.size()返回的数字为25。

我发布的第一个代码,从两个文件中正确读取字符串。

答案 2 :(得分: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;
}