Как получить количество прочитанных байтов из QTextStream - PullRequest
1 голос
/ 08 июня 2010

Следующий код, который я использую, чтобы найти число прочитанных байтов из QFile.С некоторыми файлами он дает правильный размер файла, но с некоторыми файлами он дает мне значение, которое приблизительно равно fileCSV.size () / 2.Я отправляю два файла с одинаковым количеством символов, но с разными размерами текст ссылки .Должен ли я использовать некоторые другие объекты для чтения 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 ]

3 голосов
/ 08 июня 2010

Я думаю, это потому, что QString::size() возвращает количество символов. Если ваш текстовый файл имеет формат UTF16 и, скажем, x байтов длиной, это будет соответствовать x / 2 символам.

Изменить: Если вы хотите узнать точный размер строки чтения, вы можете просто использовать QFile::readLine(). Это возвращает QByteArray, из которых количество байтов может быть запрошено с помощью size().

0 голосов
/ 19 апреля 2013

Есть похожий вопрос: Поведение 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;
}
0 голосов
/ 09 июня 2010

Я сделал решение с помощью 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 .

Когда я читаю largeFile.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.

Первый код, который я разместил, правильно читает строки из обоих файлов.

...