1

私は ofstream を作成しましたが、それが空であるかどうか、またはそれにストリーミングされたものがあるかどうかを確認する必要があるポイントがあります。

これを行う方法について何か考えはありますか?

4

2 に答える 2

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";
于 2012-02-09T06:30:30.480 に答える
1

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

于 2012-02-09T06:29:52.253 に答える