1

我使用以下代码从 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 的大小是错误的,如果可以的话,给我一些其他的解决方案。

谢谢你。

4

3 回答 3

3

我猜这是因为QString::size()返回字符数。如果您的文本文件是 UTF16 格式,并且例如 x 字节长,这将对应于 x/2 个字符。

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

于 2010-06-08T14:04:11.110 回答
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的文件。

当我用这种方法读取更大的File.csv时,第一行被正确读取,字符串的大小为108,字符数为108。arrayCSV.size()返回的数字为221。当我阅读时第二行,字符串的大小是50,但字符数是25。arrayCSV.size()返回的数字是51。当我用调试器打开字符串时,字符串是空的,虽然它的大小是50 .我猜这种行为是因为第一行是用一种编码编写的,而另一行是用不同的编码编写的,导致 QTextStream 行为不正常。

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

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

于 2010-06-09T15:36:03.727 回答
0

有一个类似的问题:QTextStream 行为搜索字符串不是预期的 。你可以检查我的答案。

简而言之:要进行正确的计算,您应该使用 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;
}
于 2013-04-19T10:21:44.720 回答