5

効率的なトークナイザーを作成するために、QFile を読み取る QTextStream の次の文字を覗き見したいと思います。

しかし、そうするための満足のいく解決策は見つかりません。

QFile f("test.txt");
f.open(QIODevice::WriteOnly);
f.write("Hello world\nHello universe\n");
f.close();

f.open(QIODevice::ReadOnly);
QTextStream s(&f);
int i = 0;
while (!s.atEnd()) {
  ++i;
  qDebug() << "Peek" << i << s.device()->peek(3);
  QString v;
  s >> v;
  qDebug() << "Word" << i << v;
}

次の出力が得られます。

Peek 1 "Hel" # it works only the first time
Word 1 "Hello" 
Peek 2 "" 
Word 2 "world" 
Peek 3 "" 
Word 3 "Hello" 
Peek 4 "" 
Word 4 "universe" 
Peek 5 "" 
Word 5 ""

QTextStream::pos() と QTextStream::seek() を使って、いくつかの実装を試しました。これはうまく機能しますが、pos() にはバグがあります (ファイルが大きすぎると -1 を返します)。

この再発する問題の解決策はありますか? 前もって感謝します。

4

2 に答える 2

2

から覗きQIODeviceますが、次に から読み取ります。これが、QTextStreamのぞき見が一度しか機能しない理由です。これを試して:

while (!s.atEnd()) {
      ++i;
      qDebug() << "Peek" << i << s.device()->peek(3);
      QByteArray v = s.device()->readLine ();
      qDebug() << "Word" << i << v;
}

残念ながら、QIODeviceは単語の読み取りをサポートしていないため、peak と read を組み合わせて自分で行う必要があります。

于 2014-01-28T10:37:48.040 に答える
0

無効QTextStream::autoDetectUnicodeにしてみてください。これにより、デバイスを先読みして検出を実行し、問題を引き起こす可能性があります。

念のためコーデックも設定しておきましょう。

ログに追加して、s.device()->pos()それs.device()->bytesAvailable()を確認します。


QTextStream コード を確認しました。常に可能な限り多くのデータをキャッシュしているように見え、この動作を無効にする方法はありません。デバイスでのピークを使用することを期待していましたが、貪欲な方法でしか読み取れません。QTextStream肝心なのは、デバイスとピークデバイスを同時に使用することはできないということです。

于 2014-01-28T13:45:13.217 に答える