我已经创建了一个ofstream,并且有一点我需要检查它是否为空或者是否有内容流入其中。
我有什么想法会这样做吗?
答案 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来读取它。我相信这应该有用。