2009-04-02 4 views
1

私はistream :: get()を使用して文字でファイルを読み込みます。この関数を何らかの方法で終了して、ファイルに書式設定された読み込み(空白のみなど)が残っていないかどうかを確認し、対応するフラグ(EOF、不良など)を設定する方法を教えてください。フォーマットされた入力を読み取らずにistreamにEOFを設定するにはどうすればよいですか?

答えて

1

ストリームから任意の量の先頭(または末尾のまま)の空白をいつでも取り除くことができます。これはstd::wsに読んでください。たとえば、私たちはSTDINからファイルを読んでいたならば、私たちはどうなる:この質問の他のバージョンにthis comment

std::cin >> std::ws 

クレジット、4年後に尋ねました。

-1

この関数を、ファイルに書式設定された読み込みに何も残らないようにするために、何らかの方法で終了するにはどうすればよいですか?

空白文字はストリーム内の文字です。ストリームがあなたのためにインテリジェントな処理を行うと想定することはできません。あなた自身のフィルタリングストリームを書くまで、そして、そうでない限り。

+0

はい、私は基本的に、書式付きの読み込み(>>を使用)と同じものを設定することができますが、呼び出された後はどうしますか?文字列とそれに続く20個の改行を含むファイル文字列を読み込んだ後にEOFフラグをセットするでしょうか? –

+0

改行も文字です。私はあなたに答えを与えたと思う。私は内容 「文字列 」でファイルを持っていると私は 文字列TakenInをすれば – dirkgently

+0

いいえ、参照してください。 FileWithNewlines >> TakenIn; FilewithNewlines.eof(); //これはtrueを返します –

1

ストリームにを作成します。そのskipwsフォーマットフラグがセットされ、コンストラクタは第二引数(noskipws)、すべての主要な空白文字(ロケールとしてtrueが渡されていない場合は

:これはa few side effects、我々はビーイング気に1を持っています特異的)を抽出して廃棄する。この操作は、文字のソースを排気する場合、関数の両方failbiteofbit内部状態フラグデフォルト

-1

設定し、フォーマットされた抽出操作(operator>>()のオーバーロード)の全てが抽出前空白スキップitem - このアプローチで道を切り開いてもよろしいですか?

yesの場合、あなたはおそらくistreamから、新しいクラス、my_istreamを導出し、最後に次のメソッドを呼び出すために、各operator>>()をオーバーライドすることで、あなたが望むものを達成できる:

void skip_whitespace() { 
    char ch; 
    ios_base old_flags = flags(ios_base::skipws); 
    *this >> ch; // Skips over whitespace to read a character 
    flags(old_flags); 

    if (*this) { // I.e. not at end of file and no errors occurred 
     unget(); 
    } 
} 

それはかなりです仕事の。ここではいくつかの詳細を省略しています(より一般的な解決策はクラステンプレートbasic_istream<CharT, Traits>をオーバーライドすることです)。

-1

istreamは多くの助けにはならないでしょう - それは設計どおりに機能します。しかし、実際の読み込みをstreambufsに委譲します。あなたのstreambufラッパーが末尾の空白をトリムした場合、そのstreambufから読み込んだistreamは気付かないでしょう。

関連する問題