2014-10-22 5 views
1

버퍼 스트림을 다른 스트림으로 푸시 한 후 s 문자열 스트림을 다시 사용할 수 있습니까 stream.rdbuf() 기능이 있습니까?rdbuf 후에 문자열 스트림을 다시 사용

나는 상황 재구성 :

http://ideone.com/JoPJ1E

#include <iostream> 
using namespace std; 
#include <fstream> 
#include <sstream> 
#include <assert.h> 

ofstream f("t.txt"); 

void dump(stringstream & s){ 
    f << s.rdbuf(); 
    assert(f.good()); // THIS ASSERT FAILS IN my code (see main) 
} 

void doit1(){ 

    static std::stringstream s; 

    s.str(""); 
    s.clear(); 
    s.seekp(0); 
    s.seekg(0); 

    s << "1"; 
    dump(s); 

} 

void doit2(){ 
    // your code goes here 
    std::stringstream s; 
    s << "2"; 
    dump(s); 

} 

int main() { 
    // your code goes here 
    doit2(); 
    doit1(); // ASSERT FAILS HERE 
} 

내 프로그램이 충돌하지 않습니다, 그리고 텍스트 파일의 출력이 없다! doit1()을 호출하여 어설 션이 정확하게 실패합니다. 왜 doit2가 스트림 f을 나쁜 상태로 설정합니까?

무엇이 잘못 되었습니까?

+1

나를 위해 작동합니다. – Oncaphillis

+0

나를 위해, 그러나 어떻게 든 그것은 여기에서하지 않는다, MWE를 얻으려고 노력한다 – Gabriel

+0

"그것은 여기에서"무엇을 의미하지 않느냐? – 0x499602D2

답변

0

빈 콘텐츠와 연결된 스트림에서 seekp를 사용하여 0 위치를 설정할 때 Dinkumware (Microsoft의 경우 STL 공급자)가 long-standing MSVC design issue으로 보입니다. 외관상으로는 컴파일러가 Perennial C++ test suite을 따르도록하기 위해이 작업을 수행했으며 그 표준에 따라 결정되었습니다.

나는

basic_ostream & seekp (pos_type의 POS) §27.7.3.5 basic_ostream이 회원/P3를 추구 이후 N3797이 매우 명확하지 말합니다 찾을;

3 개 효과! 페일() = TRUE ,

rdbuf()를 실행하는 경우 -> pubseekpos (POS는 ios_base :: 아웃). 오류의 경우 함수는 setstate (failbit)를 호출합니다 (이는 ios_base :: failure를 throw 할 수 있음).

4 반환 값 : * this.

pubseekpos (equivalent)을 호출해도 버그가 발생하지 않습니다.

는 MSVC2013Update4와 테스트 :

int main() { 
    std::stringstream s; 
    s.str(""); 
    if (s.fail()) 
     cout << "bad"; // not printed 
    s.seekp(0); 
    // s.rdbuf()->pubseekpos(0, ios_base::out); // Equivalent as per 27.7.3.5/3 
    if (s.fail()) 
     cout << "bad"; // printed 
} 

Clanggcc 잘 작동합니다.

+0

gcc를 사용하고 위의 문제가 여전히 발생하고 있습니다 (doit1에서 단정) – Gabriel

+0

스트리밍 스트림이 좋지 않거나 스트링 스트림이 아님 (위 참조) – Gabriel

+0

@Gabriel 스트링 스트림이이 때문에 failstate로 들어가면, 전체적으로 먼저 읽지 않는다면 downvote하지 마십시오. –