0

テキストが含まれているQFileで特定の文字を見つけるにはどうすればよいですか?

たとえば、ファイルのどこかに ' $5000 ' と書かれています。「$」記号を見つけたいので、番号に達したことに気づきます。

maxlen として 1 を入れて QString QTextStream::read(qint64 maxlen) を使用してみました:

QFile myfile("myfile.txt");
myfile.open(QIODevice::ReadWrite | QIODevice::Text);

QTextStream myfile_stream(&myfile);

  while(! myfile_stream.atEnd())
          {
              if(   myfile_stream.read(1) == '$')
               {

                  qDebug()<<"found";
                  break;
              }
          }

「エラー: 'char' から 'const char* への変換が無効です」

operator[] も使用してみましたが、ファイルには使用できないようです。

4

5 に答える 5

1

1 行ずつ読み上げ、読み終わったテキストを検索する

QTextStream stream(&myFile);
QString line;
do 
{
    line = stream.readLine();
    if(line.contains("$"))
    {
        qDebug()<<"found";
        break;
    }
} while (!line.isNull());
于 2013-06-17T13:08:58.237 に答える
0

myfile_stream.read(1)- これは良い習慣ではありません。一度に 1 バイトずつファイルから読み取るべきではありません。ファイル全体を読み取るか、ファイルが大きすぎてメモリに収まらない可能性がある場合は、行ごとにバッファリング/行を読み取ります。

発生するエラーは、QStringfor を文字リテラルと比較するためです。言うまでもなく、期待どおりに機能しません。文字列は、文字が 1 つしかない場合でも文字列です。アドバイスどおり -[]演算子を使用するか、読み取りに適した方法を使用QString::at() constしてください。これにより、余分なコピーが作成されないことが保証されます。QFile、または では使用しませんQTextStreamが、ファイルを対象とするテキスト ストリームQStringのメソッドから返されるで使用します。read()

テキストをメモリに格納したら、含まれている文字のインデックスを検索QStringするなどの通常の方法を使用できます。indexOf()

于 2013-06-17T15:11:12.917 に答える
0

投稿したエラー メッセージは、コードの問題と一致しません。おそらく、エラーは他の何かによって引き起こされました。

QTextStream::read戻りますQString。直接比較することはできませんがQString、次のことに役立ちます。const char*operator[]

QString s = stream.read(1);
if (s.count() == 1) {
  if (s[0] == '$') {
    //...
  }
}

ただし、小さすぎる部分でファイルを読み取ると、非常に遅くなります。ファイルが十分に小さい場合は、一度にすべてを読み取ることができます。

QString s = stream.readAll();
int index = s.indexOf('$');

ファイルが大きい場合は、小さなチャンク (たとえば 1024 バイト) ごとにファイルを読み取り、indexOf結果と既に読み取られたチャンクの数を使用して見つかった文字のインデックスを計算することをお勧めします。

于 2013-06-17T13:05:56.020 に答える
0

「$」記号を見つけたいので、番号に達したことに気づきます。

「$」記号を検索しているように思えますが、これは、その後に続くドルの値の方に関心があるためです。この場合、ファイルを 1 行ずつ読み込んで実行し、QRegExp探している値を抽出することをお勧めします。

QRegExp dollarFind("\\$(\\d+)");
while(!myfile_stream.atEnd()){
    QString line = myfile_stream.readLine();
    if (dollarFind.exactMatch(line)){
        QStringList dollars = dollarFind.capturedTexts();
        qDebug() << "Dollar values found: " << dollars.join(", ");
    }
}
于 2013-06-17T15:36:34.920 に答える