2012-06-04 4 views
1
istream &func(istream &in) 
{ 
    string data; 

    while (in >> data, !in.eof()) { 
     if (in.bad()) 
      throw runtime_error("IO stream corrupted"); 
     if (in.fail()) { 
      cerr << "bad data, try again" << endl; 
      in.clear(); 
      in.ignore(200); 
      continue; 
     } 

     cout << data << endl;; 
    } 

    //in.clear(istream::eofbit | istream::failbit); 
    in.clear(); 

    return in; 
} 

in.clear(istream::eofbit | istream::failbit);은 cin을 재설정 할 수 없습니까?iostream clear()

그러나 in.clear으로 만들 수 있습니다.

추신 :이 함수는 main()에서 사용하고 cin을 매개 변수로 사용합니다. 맑은

+0

'istream :: badbit'이 (가) 실패하지 않았는지 확인하십시오. 2가 아닌 3 가지 가능한 값이 있습니다. –

+0

* ctrl-d *를 사용하여 istream을 종료하면'eofbit'과'failbit'가 설정되어야합니다! – iverson

+0

"should"로 무엇을 의미합니까? 왜 'badbit'도 설정해서는 안됩니까? –

답변

5

는 다음과 같이 정의된다 :

공극 클리어 (iostate 상태 = goodbit);

이렇게 효과적으로 in.clear();은 스트림을 재설정하는 in.clear(istream::goodbit);입니다. in.clear(istream::eofbit | istream::failbit);을 호출하면 eofbitfailbit이 모두 설정되지만, 내가 원하는 것은 아닌지 의심 스럽습니다.

std::cin.clear(std::istream::eofbit | std::istream::failbit); 
std::ios_base::iostate state = std::cin.rdstate(); 
if(state == (std::istream::eofbit | std::istream::failbit)) 
{ 
    std::cout << "eofbit and failbit set" << std::endl; 
} 
+0

'clear()'와'setstate()'는 차이가 없습니까? – iverson

+0

@iverson :'setstate'는'clear (rdstate() | state);'를 호출합니다. 그러나 목적은 다릅니다. –

+0

좋아요, 또 다른 질문이 있습니다 : 나는 단지 clear()를 테스트합니다. 단지'failbit'을 지우고 싶다면'clear (istream :: failbit)'도 작동하지 않습니다. 어떻게이 목표를 달성 할 수 있습니까? – iverson