std :: getline()を使用してstd :: istreamから派生したクラスから行を読み取るのですが、どうすれば数行先に進むことができますか?
それらを読んで破棄する必要がありますか?
いいえ、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 秒かかりました。
編集: std :: istream ::ignoreを使用することもできます。https ://stackoverflow.com/a/25012566/492336を参照してください。
スキップしたい行数だけgetlineを使用する必要がありますか?
いいえ、しかしそれはおそらくあなたのコードを読んでいる人々にとって最も明確な解決策になるでしょう。スキップする行数が多い場合は、大きなブロックを読み取り、各ブロックの改行をカウントし、ファイルを停止して最後の改行の場所に再配置することで、パフォーマンスを向上させることができます。ただし、パフォーマンスの問題がない限り、スキップする行数のgetlineをループに入れます。
はいstd::getline
、改行の場所がわからない場合は使用してください。
なんらかの奇妙な理由で、改行が表示される場所を知っている場合は、ifstream::seekg
最初に使用できます。
次のような他の方法で読むことができますが、ifstream::read
おそらくstd::getline
最も簡単で最も明確な解決策です。