私は比較的簡単な質問があります。ファイルがあるとしますが、Y行までファイルのX行にアクセスしたいだけですが、これを行う最も簡単な方法は何ですか?C++のファイルから行Yを読み込むまで
私が実際に必要とするラインに達するまで、ラインで1つずつ読むことができるのは分かっていますが、より洗練されたソリューションがありますか?
ありがとうございました。
私は比較的簡単な質問があります。ファイルがあるとしますが、Y行までファイルのX行にアクセスしたいだけですが、これを行う最も簡単な方法は何ですか?C++のファイルから行Yを読み込むまで
私が実際に必要とするラインに達するまで、ラインで1つずつ読むことができるのは分かっていますが、より洗練されたソリューションがありますか?
ありがとうございました。
C++では、実際にはそうではありません(実際にはの言語ではありません。の言語です)。
ファイルの先頭から開始する必要があります。これにより、行Xの開始位置を指定できます(固定長レコードファイルではありませんが、テキストはそうでない場合があります)。
同様に、あなたが最後の行を見つけるまで、あなたが興味を持っていることを行う必要があります。
あなたは、バッファオーバーフローの悪用の怖い場合は、代わりに行の文字を読むことができる、またはあなたが固定で読むことができます-sizeブロックし、速度のために改行を数えますが、改行を数えるためにすべての文字を(コードによって明示的にまたは言語ライブラリを暗黙的に)読み込み、チェックすることに至ります。
あなたはY-X \ nまたはEOFに達するまで、\ n X回を検索し、 '読み取り'を開始します(処理に関係なく)。 UNIXスタイルの新しい行を仮定します。
行数をカウントするには、各行の末尾に行末の文字があることを確認する必要があるため、ファイルを反復処理する必要があります。私が考えることができる唯一の最適化は、行単位でファイルを読み込むのではなく、それをバッファして、行数を繰り返します。
不要な入力のバッファリングを避けるために、istream :: ignore()を使用できます。 CまたはC++を使用して
bool skip_lines(std::istream &is, std::streamsize n)
{
while(is.good() && n--) {
is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return is.good();
}
、あなたは、ファイル内のバイトの指定された数をスキップ(stdioの中のfseekとistreamsとostreamsでseekp)するために使用できるいくつかの機能が存在します。ただし、各行に可変数の文字が含まれている可能性があり、正しいオフセットを計算することができないため、指定した行数を指定することはできません。ファイルは、各行が "行"を占める配列のようなものではありません。むしろ連続したメモリ空間と見なす必要があります(ここで考えるハードウェアではありません...)
良い解決策ですが、そのステータスだけではなくストリームに送信します。それは少し柔軟性があります。 –