Проверять, пустой ли ofstream? - PullRequest
1 голос
/ 09 февраля 2012

Я создал ofstream, и есть момент, когда мне нужно проверить, пусто ли оно или в него что-то потекло.

Есть идеи, как мне поступить?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Файлы 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 голос
/ 09 февраля 2012

вы можете использовать ofstream.rdbuff , чтобы получить буфер файлов, а затем использовать streambuf :: sgetn , чтобы прочитать его. Я считаю, что это должно сработать.

...