문제
나는 사용 파일의 각 줄을 읽는 루프가 있습니다. 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
), 그리고 보초가 아닙니다.
비 신자들은 다음을 참조하십시오.
- std :: basic_ios :: 운영자 void*() CPPReference 사이트에 대한 문서,
- 그만큼 안전한 부리 관용구 Artima에 관한 기사,
- C ++ FAQ Lite §15.4,
- 표준, ...
그렇지 않으면, 다른 사람이 이미 말했듯이, 표준 인 두 번째 형태를 선호합니다. 사용하지 마십시오 fail()
정말로 당신이 장황 코드를 원한다면 - 나는 결코 기억하지 않습니다. xxx.good()
대신 사용할 수 있습니다 !xxx.fail()
나는 첫 번째 형태를 고수 할 것이다. 두 번째 형태는 작동 할 수 있지만 명백하지는 않습니다. 원래 코드는 수행중인 작업과 어떻게 행동 할 것으로 예상되는지 명확하게 설명합니다.