Q: 왜 iostream::eof를 루프의 조건문에 쓰면 안되죠?
제가 방금 이 링크의 댓글을 봤는데요, 루프의 조건문에 iostream::eof를 쓰면 "완전히 확실하게 틀리다"라고 하네요. 저는 일반적으로 while(cin>>n) 이런 식으로 코딩을 하는데, 아마 묵시적으로 EOF를 체크하는 구문일겁니다. 그런데 왜 iostream::eof 이렇게 명시적으로 EOF를 체크하는 구문을 호출하면 안되는거죠?
C 언어에서 scanf("...",...)!=EOF
를 쓰는 것과는 어떻게 다르죠?
(질문자: MAK)
A: 왜냐하면,iostream::eof은 스트림을 다 읽은 다음에 설정되기 때문입니다. 이것은 절대로 다음에 읽을 스트림이 해당 스트림의 마지막인지 여부를 나타내는 것이 아닙니다.
아래와 같은 상황을 생각해 보세요.
while(!inStream.eof()){
int data;
// 아직 스트림이 끝나지 않았고, 이제 읽기 시작합니다.
inStream >> data;
// 이런 빌어먹을, 이제 end를 읽었고, (fail bit와 마찬가지로) *여기에서만* EOF 비트가 설정될 것입니다.
// (이젠 더 이상 초기화 되어있지 않은) 데이터로 작업을 합니다.
}
이 경우에는 어떨까요.
int data;
while(inStream >> data){
// 이 라인이 수행된다면, 읽기가 성공했다고 확신할 수 있습니다.
// 만약 그렇지 않다면, 연산자 >> 을 통해 반환된 스트림의 값이 false로 변환 될 것입니다.
// 그러면 반복문의 조건에 맞지 않아 여기로 들어오지 않을 것이고
// 우리는 정상적으로 초기화 된 데이터로 작업할 수 있을 것입니다. (아마도요)
}
그리고 두 번째 질문의 경우
if(scanf("...",...)!=EOF)
는 아래와 같은 코드입니다. (역주: 스트림 데이터를 읽은 결과를 이용하기 때문에, EOF가 설정된 이후 EOF를 체크합니다)
if(!(inStream >> data).eof())
아래 코드와는 다른 코드입니다.
if(!inStream.eof())
inFile >> data
(답변자: Xeo)
-
234 84 | I just found a comment in this answer saying that using How is it different from using |
-
225 | Because
Against this:
And on your second question: Because
is the same as
and not the same as
|
'StackOverflow ' 카테고리의 다른 글
[Android] SDK의 시스템 이미지 용량이 너무 큰데, 지우면 안되나요? (0) | 2015.12.26 |
---|---|
[Eclipse] 이클립스를 클린모드로 실행시키기 (0) | 2015.12.23 |
[GIT] 'git pull' 과 'git fetch'의 차이가 뭐죠? (0) | 2015.12.18 |
[C#] C#의 정확한 버전 정보를 알려주세요 (0) | 2015.12.17 |
[Android] 안드로이드에서 투명한 Activity를 만드려면 어떻게 해야 하나요? (0) | 2015.12.15 |