2017-01-29 4 views
4

텍스트 파일에서 여러 변수를 사용하는 프로그램을 작성하고 있습니다. 프로그램에서 EOF를 찾으면
데이터 입력이 끝납니다.ifstream.good()와 bool (ifstream)의 차이점

int main() 
{ 
    int val, count = 0; 
    ifstream fileIn; 
    fileIn.open("num.txt"); 

    fileIn >> val; 
    while (fileIn) 
    { 
     ++count; 
     cout << "number: " << val << endl; 
     fileIn >> val; 
    } 
    cout << "count: " << count << endl; 

    fileIn.close(); 
    return 0; 
} 

num.txt 파일 : 11 22 33 44

프로그램 출력 :

number: 11 
number: 22 
number: 33 
number: 44 
count: 4 

모든 것이 OK입니다. 내가 fileIn에서 fileIn.good()에있는 동안 조건 섹션을 변경한다면,
프로그램의 출력은 다음과 같을 것이다 : 그것은 이제 마지막 값을 건너

number: 11 
number: 22 
number: 33 
count: 3 

. 왜 이런 현상이 발생하며 fileIn
fileIn.good()의 차이점은 무엇입니까?

+0

http://en.cppreference.com/w/cpp/io/basic_ios/good – chris

답변

4

이제 마지막 값을 건너 뜁니다. 이 문제가 발생하는 이유는 무엇입니까 차이가 fileInfileIn.good() 사이에 있습니까? fileIn와 연관된 스트림 "11 22 33 44" 주어진 콘텐츠의

fileIn >> val; 
while (fileIn) 
{ 
    ++count; 
    cout << "number: " << val << endl; 
    fileIn >> val; 
} 

. bool(fileIn)conversion operator을 사용하면 스트림이 실패하지 않았는지 여부가 반환됩니다. eof()에 도달해도 스트림이 실패하지 않습니다. 실패는 기본적으로 I/O 작업이 실패 할 때 발생합니다.

따라서 마지막 번호 44을 읽은 후 val으로 입력하십시오. 스트림이 실패하지 않았으므로 루프가 다시 입력됩니다. count이 증가되고 val이 인쇄되지만 다음은 fileIn >> val이 실패합니다. 그러면 while 루프의 조건에서 테스트되고 실패하면 루프가 종료됩니다.

Doing fileIn.good()state flags 중 하나가 설정된 경우 false을 반환합니다. 구체적 eof, failbad

2

if (fileIn)badbit 또는 failbitrdstate()가 설정되어있는 경우 true를 반환 if (!fileIn.fail()), 동일하다.

한편 fileIn.good()rdstate()이 0인지 확인합니다. fail() 외에도 eofbit 플래그를 확인합니다.

이제 마지막 값을 건너 뜁니다. 왜 이런 일이 일어나고 fileIn 과 fileIn.good()의 차이점은 무엇입니까?

당신은 val 다음 while(fileIn.good()) 다음 fileIneofbit 설정을 가지고 있기 때문에 보지 않을 것이다 다음 출력 마지막 값을 사용하여 스트림의 상태를 확인 읽기 때문입니다. 위의 설명과 같이 if(infs)으로 확인되지 않은 항목입니다.