2012-06-28 3 views
6

이 질문에 약간 stackoverflow std::cin.clear() fails to restore input stream in a good state에 비슷한 질문이 있지만 거기에 제공된 대답은 나를 위해 작동하지 않습니다.스트림의 상태를 리셋

질문 : 어떻게 스트림의 상태를 '양호'로 다시 재설정 할 수 있습니까?

여기 내 코드는 어떻게 사용합니까?하지만 상태는 다시 좋게 설정되지 않습니다. 두 줄을 따로 따로 사용했습니다.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

답변

11

여기

std::cin.clear(std::istream::failbit); 

실제로 failbit을 취소하지 않는 코드는 그 failbit으로 스트림의 현재 상태를 대체합니다.

모든 비트를 지우려면 clear()으로 전화하십시오.


표준에서 설명 약간 복잡하고, 다른 기능

void clear(iostate state = goodbit);

사후 조건

의 결과로서 언급 그렇지 않으면 rdstate()==(state | ios_base::badbit) rdbuf()!=0 다음 경우를 state == rdstate();.

기본적으로 rdstate()에 대한 다음 호출은 clear()에 전달 된 값을 반환한다는 것을 의미합니다. 다른 문제가있을 때를 제외하고는 badbit을 얻을 수도 있습니다.

또한 실제로는 goodbit은 조금은 아니지만 다른 모든 비트를 지우는 값은 0입니다. 당신은 분명 하나 개의 플래그 등이 남아 있으면

단지 하나 개의 특정 비트를 지우려면, 당신은 여전히 ​​스트림에서 읽을 수 없습니다, 그러나이 호출

cin.clear(cin.rdstate() & ~ios::failbit); 

를 사용할 수 있습니다. 따라서이 사용은 다소 제한적입니다.

+0

내 책에는 다음과 같이 말합니다 : clear (flag)는 지정된 조건 상태를 유효하게 설정합니다. 나는 이것을 다음과 같이 해석했다. 지정된 오류 비트를 지운다. 이것은 틀린가? – physicalattraction

+0

* all * 플래그를 지우는 것은 단지'clear()'입니다. 단일 플래그를 지우려면 좀 더 복잡합니다 (너무 유용하지는 않습니다). 내 대답에 새로운 부분을 추가했습니다. –