テキスト ファイルから不明なサイズの文字列を読み込もうとしていますが、次のコードを使用しました。
ifstream inp_file;
char line[1000] ;
inp_file.getline(line, 1000);
しかし、制限があるため好きではありません (この制限を超えるのは非常に難しいことはわかっています) が、次の文字列のサイズに応じて再割り当てするより良いコードを実装したいと考えています。
使用可能なオプションの一部を次に示します。
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
不明なサイズの入力を読み取るための通常のイディオムの 1 つは、ループ内で既知のサイズのチャンクを読み取り、さらに入力があるかどうかを確認することです (つまり、対象の行/ファイル/領域の最後にいないことを確認します)。 、バッファのサイズを拡張します。getline プリミティブが適切かもしれませんが、これは、記憶域の割り当てがプログラマーに任されている言語の多くのタスクの非常に一般的なパターンです。
今答えるのは遅すぎるかもしれませんが、文書化の目的で、不明なサイズの行を読み取る別の方法は、ラッパー関数を使用することです。この関数ではfgets()
、ローカル バッファーを使用して使用します。
'\0'
fgets()
'\0'
'\0'
、そうでない場合は'\n'
、まだ行を読み終えていないことを意味します。新しいバッファーを割り当て、データをこの新しいバッファーにコピーして、上記の手順 (1) に戻ります。realloc()
てバッファを大きくします。それ以外の場合は、完了です。割り当てられたバッファにデータを返します。これは、私のアルゴリズムの講義で与えられたヒントでした。
boost::iostreamsのメモリ マップト ファイルを見てください。
入力ストリームを解析するための柔軟なスキャナーであるre2cの使用を検討できますか? そうすれば、事前に知らなくても、任意のサイズの入力行を取り込むことができます...たとえば、正規表現表記を使用します
^.+$
re2cによってキャプチャされると、割り当てるメモリの量を決定できます...