2012-02-09 2 views

답변

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

아니요, 작동하지 않습니다. 현재 쓰는 스트림 버퍼의 읽기 버퍼는 일반적으로 채워지지 않습니다. 두 버퍼는 서로 관련이 없으며 동기화되지 않습니다. –

+0

지금 당장 시도해 보겠습니다. – WeaselFox

+0

물론 시도해보십시오. 그러나 표준 라이브러리를 구현하거나 심지어 구현을 수행하는 대부분의 경우에도이 방법이 작동하는지 여부를 결정하는 방법은 표준을 읽는 것입니다. 나는 표준이 이것을 보증하지 않는다고 확신한다. 그리고 내가 한 구현은 확실히 두 버퍼를 동기화하지 않는다. –

관련 문제