0

私はカスタム C++ クラッシュ コースを受講しています。基本的なことは何年も前から知っていましたが、現在は記憶を新たにして、より多くのことを学ぼうとしています。そのために、(リンクされたリストに基づくスタック クラスを作成した後の) 2 番目のタスクとして、独自の文字列クラスを作成しています。

今まではかなり順調に進んでいます。cin >> my_string; のようなことができる operator>> をオーバーロードしたいと思います。問題は、istream を正しく読み取る方法がわからないことです (または、問題は、ストリームがわからないことです...)。一度に .read() を 128 バイト処理する while (!stream.eof()) ループを試してみましたが、予想どおり、EOF でしか停止しません。cin >> で std::string に取得するように、改行に読み込んでもらいたいです。

私の文字列クラスには、メモリを (再) 割り当てる alloc(size_t new_size) 関数と、その部分を行う append(const char *) 関数がありますが、明らかに、書き込む前に割り当てるメモリの量を知る必要があります。バッファ。

これを実装する方法に関するアドバイスはありますか?Seekg() と tellg() を使用して istream の長さを取得しようとしましたが、役に立ちませんでした (-1 を返します)。また、言ったように、EOF (改行で読み取りを停止しません) までループして、一度に 1 つのチャンクを読み取ります。

4

4 に答える 4

1

ストリームから行末まで文字を読み取るには、ループを使用します。

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

部屋が足りなくなった場合は、より大きなサイズでバッファーを再割り当てしてください。データをコピーして続行します。学習プロジェクトに夢中になる必要はありません。

于 2009-11-06T11:30:11.850 に答える
0

cin::getline( buffer*, buffer_size); を使用できます。次に、不良フラグ、eof フラグ、および失敗フラグを確認する必要があります。

std::cin.bad()、std::cin.eof()、std::cin.fail()

bad または eof が設定されていない限り、fail フラグが設定されていることは通常、バッファ オーバーフローを示しているため、std::cin.clear() を呼び出した後、バッファを再割り当てし、新しいバッファへの読み取りを続行する必要があります。

于 2009-11-06T09:29:28.760 に答える
0

補足: STL では、この種の機能を提供するために istream の operator>> がオーバーロードされているか、( *char に関しては) グローバル関数です。クラスで演算子をオーバーロードするのではなく、カスタム オーバーロードを提供する方が賢明かもしれません。

于 2009-11-06T09:42:10.423 に答える
0

この質問に対する Jerry Coffin の回答を確認してください。

彼が使用した最初の方法は非常に単純で (単なるヘルパー クラス) std::vector<std::string>、ベクトルの各要素が元の入力の行を表す場所に入力を書き込むことができます。

後で処理するときは、本当に簡単です。

于 2009-11-06T09:44:34.013 に答える