2012-02-09 53 views
1

我已经创建了一个ofstream,并且有一点我需要检查它是否为空或已经有东西流入它。检查以确定ofstream是否为空?

任何想法,我怎么会去这样做?

+0

广东话你EOF或rdstate功能检查呢? – sarat 2012-02-09 06:29:34

回答

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

不,它不会工作:当前正在写入的流缓冲区的读取缓冲区通常不会被填充。这两个缓冲区没有任何关系,并且它们不会保持同步。 – 2012-02-09 06:31:28

+0

我现在要试试这个 – WeaselFox 2012-02-09 06:37:07

+0

当然,给它一个。但是,即使存在标准库实现,甚至是大部分实现它的实现,确定其工作原理的方式也是读取标准。我很确定标准不能保证这一点,我所做的实现当然不会保持两个缓冲区同步。 – 2012-02-09 06:40:12