12

std :: getline()を使用してstd :: istreamから派生したクラスから行を読み取るのですが、どうすれば数行先に進むことができますか?

それらを読んで破棄する必要がありますか?

4

3 に答える 3

20

いいえ、getline を使用する必要はありません

より効率的な方法は、std::istream::ignoreで文字列を無視することです

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

もちろん、HandleReadingLineError は標準ではなく手作りです。最初のパラメーターは、抽出する最大文字数です。これが正確に numeric_limits::max() である場合、制限はありません: cplusplus.com のリンク: std::istream::ignore

多くの行をスキップする場合は、getline の代わりにそれを使用する必要があります。ファイルで 100000 行をスキップする必要がある場合、getline では 22 秒でしたが、約 1 秒かかりました。

于 2014-07-29T09:53:21.633 に答える
11

編集: std :: istream ::ignoreを使用することもできます。https ://stackoverflow.com/a/25012566/492336を参照してください。


スキップしたい行数だけgetlineを使用する必要がありますか?

いいえ、しかしそれはおそらくあなたのコードを読んでいる人々にとって最も明確な解決策になるでしょう。スキップする行数が多い場合は、大きなブロックを読み取り、各ブロックの改行をカウントし、ファイルを停止して最後の改行の場所に再配置することで、パフォーマンスを向上させることができます。ただし、パフォーマンスの問題がない限り、スキップする行数のgetlineをループに入れます。

于 2010-04-05T23:42:12.237 に答える
8

はいstd::getline、改行の場所がわからない場合は使用してください。

なんらかの奇妙な理由で、改行が表示される場所を知っている場合は、ifstream::seekg最初に使用できます。

次のような他の方法で読むことができますが、ifstream::readおそらくstd::getline最も簡単で最も明確な解決策です。

于 2010-04-05T23:42:10.467 に答える