C ++のcharバッファに演算子をオーバーロード>> - 私は、ストリームの長さを伝えることができますか?
-
18-09-2019 - |
質問
私は、カスタムC ++クラッシュコースです。私は長年の基本を知っていたが、私は現在、私の記憶をリフレッシュし、多くを学ぶためにしようとしています。そのために、(リンクされたリストに基づいて、スタッククラスを書いた後)私の2番目のタスクとして、私は自分の文字列クラスを書いています。
これは、今までかなりスムーズに行っています。私はCIN >> my_stringのようなものを行うことができます>>演算子をオーバーロードしたい;. 問題は、私は正しくはistreamの読み方を知らないということである(または、おそらく問題は、私は...ストリームを知らないということです)。私は一度に()の128のバイトを.read中(!stream.eof())ループを試してみましたが、1想像のとおり、それだけでEOFに停止します。あなたはSTD ::文字列に>> CINを得るように私は、それが改行に読んでもらいたい。
私の文字列クラスは、アロケーション(size_tののnew_size)(再)という機能メモリを割り当て、その部分を行いアペンド(のconst char型*)機能を持っているが、私は明らかに私ができる前に割り当てるメモリの量を知っておく必要がありますバッファに書き込みます。
これを実装する方法上の任意のアドバイスはありますか?私は(それは-1を返す)私はEOFは、一度に1つのチャンクを読み込む(改行で読み取りを停止しない)までループし、前記のように。無駄に、seekg()とtellg()とのIStream長さを取得しようとしました
解決
線の端部がループを使用するまで、ストリームから文字を読み取ること。
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.
あなたが部屋を使い果たした場合は、大きいサイズを使用してバッファを再割り当て。 間でデータをコピーして続行します。学習プロジェクトのために空想する必要はありませんん。
他のヒント
あなたはCIN :: getlineの(バッファ*、BUFFER_SIZE)を使用することができます。 あなたが悪い、EOFをチェックし、フラグを失敗する必要があります。
のstd :: cin.bad()、のstd :: cin.eof()、のstd :: cin.fail()
あなたのバッファを再割り当てとstd :: cin.clear()を呼び出した後に、新しいバッファに読み続ける必要がありますので、EOF悪いかが設定されていない限り、失敗フラグが通常設定されているが、バッファオーバーフローを示します。
サイドノート:STLでのIStreamのオペレータは>>(* charのような)機能や、この種を提供するためにオーバーロードされたグローバル関数です。多分あなたの代わりに、クラスの演算子をオーバーロードのカスタムオーバーロードを提供するために、より賢明だろう。
この質問にジェリーの棺の答えをチェックのます。
彼が使用する第1の方法は(単にヘルパークラス)非常に簡単です、あなたは、ベクトルの各要素は、元の入力の行を表しstd::vector<std::string>
であなたの入力を書くことができます。
それがその後の処理に来るときは本当に物事が容易になりますこと!