2013-02-10 3 views
3

다음 코드 단편은 stringstream 객체를 사용하여 문자열에서 정수를 추출하고 정수 추출이 성공했는지 여부를 감지하기위한 것입니다. stringstream 클래스는 >> 연산자를 상속하여 istream 인스턴스에 대한 참조를 반환합니다. 실패한 정수 추출은 str 멤버가 여전히 strInput 인 동안 myStream이 0이되는 방법은 무엇입니까? 그것이 실패했을 때 또는 void *에 NULL의 경우 -if 문에서 stringstream >> 연산자 사용

stringstream myStream(strInput); 
if (myStream >> num){//successfull integer extraction} 
else{//unsuccessfull integer extraction 
cout<<myStream<<endl; 
cout<<myStream.str().c_str()<<endl;} 

답변

4

은 (같은) !fail()를 반환하는 stream에 대한 operator bool() 또는 operator void*() 있습니다. 따라서 스트림이 실패하지 않은 경우 정상입니다. operator >>stream 객체에 대한 참조를 반환하므로 컴파일러에서 "흐림 객체를 진리와 비교할 수 없으므로 bool을 만들 수 있는지 보겠습니다. 또는 void *을 만들 수 있습니다. 그렇습니다. 사용하도록하겠습니다. .

+1

예! 구체적으로'std :: basic_ios'를위한 것입니다. 여기에'operator void *'와'operator bool'을 보라. http://en.cppreference.com/w/cpp/io/basic_ios –

+0

정수 추출에 실패하면 0을 표시하므로 첫 번째 cout 문과 동일하다고 가정합니다. 컴파일러는 cout이 그것을 표시 할 수 있도록 bool 또는 void *로 만듭니다. –

+0

예, 적어도 비슷한 것을 할 것입니다. –

1

대답은 converts std::ios to void*가 (AN operator to convert basic_ios to a bool in C++11 대체) 연산자이다 :

IOS로부터 유도 된 객체 포인터에 캐스트 될 수있는 스트림이 포인터가 널 포인터 에러 중 어느 하나의 경우 플래그 (failbit 또는 badbit)가 설정되고 그렇지 않으면 0이 아닌 포인터입니다.

if, while 또는 for 상태에서 스트림을 사용할 때이 연산자가 호출됩니다. 쓰기가 필요할 때 단 하나의 ! 연산자가 있습니다.

if (!(myStream >> num)) { 
    ... 
} 
+1

+1하지만, 거의 모든 컴파일러가 C++ 11 모드에서도 여전히 그것을 'void *'로 구현하지만, afaik, 이것은 pre-C++ 11입니다. 엄격한 C++ 11 ('명시 적 연산자 bool()'을 요구함)의 경우, Mats의 대답은 정확합니다. – us2012

+0

@ us2012 완료. 감사! – dasblinkenlight

+0

모든 도움에 많은 감사드립니다. –