2012-02-09 51 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