2009-05-12 10 views
0

私は比較的簡単な質問があります。ファイルがあるとしますが、Y行までファイルのX行にアクセスしたいだけですが、これを行う最も簡単な方法は何ですか?C++のファイルから行Yを読み込むまで

私が実際に必要とするラインに達するまで、ラインで1つずつ読むことができるのは分かっていますが、より洗練されたソリューションがありますか?

ありがとうございました。

答えて

5

C++では、実際にはそうではありません(実際にはの言語ではありません。の言語です)。

ファイルの先頭から開始する必要があります。これにより、行Xの開始位置を指定できます(固定長レコードファイルではありませんが、テキストはそうでない場合があります)。

同様に、あなたが最後の行を見つけるまで、あなたが興味を持っていることを行う必要があります。

あなたは、バッファオーバーフローの悪用の怖い場合は、代わりに行の文字を読むことができる、またはあなたが固定で読むことができます-sizeブロックし、速度のために改行を数えますが、改行を数えるためにすべての文字を(コードによって明示的にまたは言語ライブラリを暗黙的に)読み込み、チェックすることに至ります。

2

あなたはY-X \ nまたはEOFに達するまで、\ n X回を検索し、 '読み取り'を開始します(処理に関係なく)。 UNIXスタイルの新しい行を仮定します。

2

行数をカウントするには、各行の末尾に行末の文字があることを確認する必要があるため、ファイルを反復処理する必要があります。私が考えることができる唯一の最適化は、行単位でファイルを読み込むのではなく、それをバッファして、行数を繰り返します。

4

不要な入力のバッファリングを避けるために、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(); 
} 
+0

良い解決策ですが、そのステータスだけではなくストリームに送信します。それは少し柔軟性があります。 –

0

、あなたは、ファイル内のバイトの指定された数をスキップ(stdioの中のfseekとistreamsとostreamsでseekp)するために使用できるいくつかの機能が存在します。ただし、各行に可変数の文字が含まれている可能性があり、正しいオフセットを計算することができないため、指定した行数を指定することはできません。ファイルは、各行が "行"を占める配列のようなものではありません。むしろ連続したメモリ空間と見なす必要があります(ここで考えるハードウェアではありません...)

関連する問題