2012-02-09 13 views
1

私はofstreamを作成しましたが、それが空であるか、それともストリーミングされているかをチェックする必要があります。ofstreamが空であることを確認していますか?

どのようにすればよいでしょうか?

+0

カントあなたがEOFまたはrdstate機能でそれをチェックこれは、このような単純な見て見ることができますか? – sarat

答えて

2

std::ofstreamファイルは、これを直接サポートしていません。これが重要な要件である場合は、内部でstd::filebufを使用するフィルタリングストリームバッファを作成するだけでなく、出力があれば記録することもできます。

struct statusbuf: 
    std::streambuf { 
    statusbuf(std::streambuf* buf): buf_(buf), had_output_(false) {} 
    bool had_output() const { return this->had_output_; } 
private: 
    int overflow(int c) { 
     if (!traits_type::eq_int_type(c, traits_type::eof())) { 
      this->had_output_ = true; 
     } 
     return this->buf_->overflow(c); 
    } 
    std::streambuf* buf_; 
    bool   had_output_; 
}; 

あなたはこれでstd::ostreamを初期化し、必要に応じてストリームバッファを照会することができます:

std::ofstream out("some file"); 
statusbuf  buf(out.rdbuf()); 
std::ostream sout(&buf); 

std::cout << "had_output: " << buf.had_output() << "\n"; 
sout << "Hello, world!\n"; 
std::cout << "had_ouptut: " << buf.had_output() << "\n"; 
1

ofstream.rdbuffを使用してファイルバッファを取得し、streambuf::sgetnを使用して読み取ることができます。私はそれがうまくいくと信じています

+2

いいえ、動作しません。現在書き込んでいるストリームバッファの読み出しバッファは、通常は埋められません。 2つのバッファは互いに関係がなく、同期していません。 –

+0

私は今すぐこれを試してみよう。 – WeaselFox

+0

確かに、行きなさい。しかし、それを行う標準的なライブラリの実装やそれを行う実装の大部分があっても、これが動作するかどうかを判断する方法は標準を読むことです。標準ではこれが保証されていないと確信しています。実装した実装では、2つのバッファを同期させないようにしています。 –

関連する問題