문제

나는 사용 파일의 각 줄을 읽는 루프가 있습니다. getline():

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

나는 그 부름을 알아 차렸다 getline() 이와 같이 작동하는 것 같습니다.

while (getline(is, line))

여기서 무슨 일이야? getline() 스트림 참조를 반환합니다. 어떻게 든 포인터로 변환되고 있습니까? 이것은 실제로 좋은 관행입니까, 아니면 첫 번째 형태를 고수해야합니까?

도움이 되었습니까?

해결책

그만큼 istream 반환 getline() 운영자가 있습니다 void*() 스트림이 오류가 발생했는지 여부를 반환하는 메소드가 암시 적으로 호출됩니다. 따라서 전화보다 더 많은 수표를하고 있습니다. eof().

다른 팁

업데이트 :

나는 실수로 Basic_istream 문서 Basic_istream :: Sentry 클래스의 연산자 bool () 메소드의 경우, 지적한 바와 같이 이것은 실제로 일어나는 일이 아닙니다. 나는 Charles와 Luc의 정답에 투표했습니다. 실제로 호출되는 운영자 void*()입니다. 이것에 대해 더 C ++ FAQ에서.

찰스는 주었다 정답.

실제로 불리는 것은 실제로입니다 std::basic_ios::operator void*(), 그렇지 않습니다 sentry::operator bool(), 그것은 사실과 일치합니다 std::getline() 반환 a std::basic_istream (따라서, a std::basic_ios), 그리고 보초가 아닙니다.

비 신자들은 다음을 참조하십시오.

그렇지 않으면, 다른 사람이 이미 말했듯이, 표준 인 두 번째 형태를 선호합니다. 사용하지 마십시오 fail() 정말로 당신이 장황 코드를 원한다면 - 나는 결코 기억하지 않습니다. xxx.good() 대신 사용할 수 있습니다 !xxx.fail()

나는 첫 번째 형태를 고수 할 것이다. 두 번째 형태는 작동 할 수 있지만 명백하지는 않습니다. 원래 코드는 수행중인 작업과 어떻게 행동 할 것으로 예상되는지 명확하게 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top