检查ofstream是否为空?

时间:2012-02-09 06:22:05

标签: c++ stream ofstream

我已经创建了一个ofstream,并且有一点我需要检查它是否为空或者是否有内容流入其中。

我有什么想法会这样做吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以使用ofstream.rdbuff来获取文件缓冲区,而不是使用streambuf::sgetn来读取它。我相信这应该有用。