Armenの解答は正解ですが、私はjweyrichのキャッシュアイディアに基づいて代替案を捨てると思いました。より良いか悪いかにかかわらず、これは構築時にファイル全体を読み込みますが、改行位置だけを保存します(ファイル全体を格納しないので大量のファイルでうまくいきます)。次に、ReadNthLineを呼び出すだけですぐに呼び出すことができますその行にジャンプし、必要な1行を読み込みます。一方、これは、一度に行の一部を取得したいだけで、コンパイル時に行番号がわからない場合にのみ最適です。ここで
class TextFile {
std::ifstream file_stream;
std::vector<std::ifstream::streampos> linebegins;
TextFile& operator=(TextFile& b) = delete;
public;
TextFile(std::string filename)
:file_stream(filename)
{
//this chunk stolen from Armen's,
std::string s;
//for performance
s.reserve(some_reasonable_max_line_length);
while(file_stream) {
linebegins.push_back(file_stream.tellg());
std::getline(file_stream, s);
}
}
TextFile(TextFile&& b)
:file_stream(std::move(b.file_stream)),
:linebegins(std::move(b.linebegins))
{}
TextFile& operator=(TextFile&& b)
{
file_stream = std::move(b.file_stream);
linebegins = std::move(b.linebegins);
}
std::string ReadNthLine(int N) {
if (N >= linebegins.size()-1)
throw std::runtime_error("File doesn't have that many lines!");
std::string s;
// clear EOF and error flags
file_stream.clear();
file_stream.seekg(linebegins[N]);
std::getline(file_stream, s);
return s;
}
};
あなたがループでこれをラップし、カウンタを使用することができます。http://stackoverflow.com/questions/3910326/c-read -file-line-by-line-then-split-each-line-the-delimiter/3910610#3910610 - しかし、ファイルの内容全体をメモリに保存して、複数の検索を実行すると、すばらしく速い。 – jweyrich