0

テキスト ファイルから不明なサイズの文字列を読み込もうとしていますが、次のコードを使用しました。

ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);

しかし、制限があるため好きではありません (この制限を超えるのは非常に難しいことはわかっています) が、次の文字列のサイズに応じて再割り当てするより良いコードを実装したいと考えています。

4

5 に答える 5

6

使用可能なオプションの一部を次に示します。

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
于 2010-09-03T11:42:10.833 に答える
2

不明なサイズの入力を読み取るための通常のイディオムの 1 つは、ループ内で既知のサイズのチャンクを読み取り、さらに入力があるかどうかを確認することです (つまり、対象の行/ファイル/領域の最後にいないことを確認します)。 、バッファのサイズを拡張します。getline プリミティブが適切かもしれませんが、これは、記憶域の割り当てがプログラマーに任されている言語の多くのタスクの非常に一般的なパターンです。

于 2010-09-03T11:45:08.217 に答える
0

今答えるのは遅すぎるかもしれませんが、文書化の目的で、不明なサイズの行を読み取る別の方法は、ラッパー関数を使用することです。この関数ではfgets()、ローカル バッファーを使用して使用します。

  1. バッファの最後の文字を'\0'
  2. 電話fgets()
  3. 最後の文字を確認して、まだ残っているかどうかを確認します'\0'
    • そうでなく'\0'、そうでない場合は'\n'、まだ行を読み終えていないことを意味します。新しいバッファーを割り当て、データをこの新しいバッファーにコピーして、上記の手順 (1) に戻ります。
    • 既に割り当てられたバッファがある場合は、呼び出しrealloc()てバッファを大きくします。それ以外の場合は、完了です。割り当てられたバッファにデータを返します。

これは、私のアルゴリズムの講義で与えられたヒントでした。

于 2011-03-04T04:08:51.020 に答える
0

boost::iostreamsのメモリ マップト ファイルを見てください。

于 2010-09-03T12:10:48.570 に答える
0

入力ストリームを解析するための柔軟なスキャナーであるre2cの使用を検討できますか? そうすれば、事前に知らなくても、任意のサイズの入力行を取り込むことができます...たとえば、正規表現表記を使用します

^.+$

re2cによってキャプチャされると、割り当てるメモリの量を決定できます...

于 2010-09-03T11:50:00.767 に答える