2014-07-09 3 views
1

내 함수는 std::ostream& stream을 입력 매개 변수로 가져 와서 데이터를 입력하고 stream을 반환합니다.std :: ios_base :: fmtflags를 저장, 조작 및 복원

이제
stream << "| 1:" << 3.1234567890 << "|" ; 
    stream << std::endl; 
    // geting the flags up to now 
    std::ios_base::fmtflags f = stream.flags(); 
    // setting the flags the way we like it 
    stream << std::fixed << std::setprecision(9); 
    stream << "| 2:" << 3.1234567890 << "|" ; 
    stream.setf(f); 
    stream << std::endl; 
    stream << "| 3:" << 3.1234567890 << "|" ; 

출력 (surprisengly)입니다 :

| 1:3.12346| 
| 2:3.123456789| 
| 3:3.123456789| 

내가 stream를 설정하면 나는 기능을 중단으로 함수에서 나는 스트림의 플래그를 조작하지만 복원 할 싶습니다 std::cout. 분명히 stream.setf(f) 플래그를 복원 할 수 없었습니다. 왜? 그것을하는 올바른 방법은 무엇입니까?

답변

2

std::ios_base::flags은 찾고있는 기능이며 을 읽고 복원하십시오. std::ios_base::setf은 플래그 만 설정합니다. 그것은 어떤 설정도 해제하지 않을 것입니다 (기본 및 부동 형식과 같은 다중 비트 플래그에 실제로 이상한 값인 을 생성 할 수 있습니다). 에 추가로 정밀도 (플래그의 일부가 아님) 및 가능하면 채우기 문자를 저장하고 복원하는 것이 좋습니다. 당신이 모든 코드의 상단 에서이 클래스의 인스턴스를 정의하는 것입니다 그리고

class SaveIOFmt 
{ 
    std::basic_ios<char>& myOwner; 
    std::basic_ios<char>::fmtflags myFlags; 
    int myPrecision; 
    char myFill; 

    SaveIOFmt(SaveIOFmt const&); 
    SaveIOFmt& operator=(SaveIOFmt const&); 

public: 
    SaveIOFmt(std::basic_ios<char>& owner) 
     : myOwner(owner) 
     , myFlags(owner.flags()) 
     , myPrecision(owner.precision()) 
     , myFill(owner.fill()) 
    { 
    } 
    ~SaveIOFmt() 
    { 
     myOwner.fill(myFill); 
     myOwner.precision(myPrecision); 
     myOwner.flags(myFlags); 
    } 
}; 

, 당신이 떠날 때 모든 관계없이, 을 복원됩니다 : 이 일의 일반적인 방법과 같이 함께 어떻게 떠난거야.

+0

'class std :: ios_base '에'fill '이라는 이름의 멤버가 없습니다. (g ++ --version : g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3'). 어떤 의뢰? – arthur

+0

내 실수. 스트림 타입은'std :: basic_ios '이어야한다. (실제 코드는 상대적으로 오래되었고 여기에 typedef를 사용하므로 실제 유형을 보지 못했습니다.) –

1

부스트 라이브러리를 사용하고자한다면/여기에서 자신의 솔루션을 롤업 할 필요가 없다고 덧붙일 것입니다 : IO State Savers.

관련 문제