1

QFileから読み取られたバイト数を見つけるために使用している次のコード。一部のファイルでは正しいファイルサイズが得られますが、一部のファイルではおおよそfileCSV.size()/2の値が得られます。文字数は同じですが、ファイルサイズが異なる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のサイズを読み取るのは間違っていることを知っています。可能であれば、他の解決策を教えてください。

ありがとうございました。

4

3 に答える 3

3

QString::size()文字数を返すからだと思います。テキスト ファイルが UTF16 で、たとえば x バイトの長さの場合、これは x/2 文字に対応します。

編集:読み取り行の正確なサイズを知りたい場合は、QFile::readLine(). QByteArrayこれは、を使用してクエリできるバイト数の を返しますsize()

于 2010-06-08T14:04:11.110 に答える
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 に答える
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を送信しているファイルをよく見てください。

この方法で bigFile.csv を読んでいると、最初の行が正しく読み取られ、文字列のサイズは 108、文字数も 108 です。arrayCSV.size() によって返される数値は 221 です。 2 行目、文字列のサイズは 50 ですが、文字数は 25 です。arrayCSV.size() によって返される数は 51 です。デバッガーで文字列を開くと、サイズが 50 であるにもかかわらず、文字列は空です。 . この動作は、最初の行が 1 つのエンコーディングで記​​述されているのに対し、別のエンコーディングで記​​述されているため、QTextStream が適切に動作しないためだと思います。

smallFile.csv を読んでいるときは、すべて問題ありません。文字列のサイズは 16 で、文字数も 16 (\n 文字を除く) です。arrayCSV.size() が返す数値は 18 です。2 行目も正しく読み取られています。文字列のサイズは 25 で、文字数も 25 です。arrayCSV.size() によって返される数は 25 です。

私が投稿した最初のコードは、両方のファイルから文字列を適切に読み取ります。

于 2010-06-09T15:36:03.727 に答える