2014-04-19 4 views
2

첫 번째 사항 - 이진수가있는 텍스트 파일이 각 행에 하나씩 있습니다. 나는 그들을 읽고 C++ 프로그램에서 그들을 요약하려고 노력하고있다. 나는 그들을 10 진수로 변환하고 그것들을 추가 한 함수를 작성했다. 그리고 함수의 ok를 확실히 알고있다. 그리고 여기 내 문제입니다 - 텍스트 파일을 읽는 두 가지 방법, 나는 다른 결과를 얻을 (이러한 결과의 하나가 바로입니다) [내 기능 소수점입니다()] :while (! file.eof())와 while (file >> variable)의 차이점

ifstream file; 
file.open("sample.txt"); 
int sum = 0; 
string BinaryNumber; 
while (!file.eof()){ 
    file >> BinaryNumber; 
    sum+=decimal(BinaryNumber); 
} 

하고 그런 식으로 내 합계는 너무 크지 만 소량입니다.

ifstream file; 
file.open("sample.txt"); 
int sum = 0; 
string BinaryNumber; 
while (file >> BinaryNumber){ 
    sum+=decimal(BinaryNumber); 
} 

이렇게하면 올바른 금액을 얻을 수 있습니다. 몇 가지 테스트를 한 후에, while 루프는 while 루프가 루프를 반복하는 동안 하나의 반복을 작성한다는 결론에 도달했습니다. 그래서 제 질문은 - 텍스트 파일에서 읽는 두 가지 방법의 차이점은 무엇입니까? 첫 번째 while 루프가 왜 나에게 잘못된 결과를주고 왜 반복되는 반복이 될 수 있습니까?

+0

'file >> 변수는 입력 후'file'의 상태를 검사합니다. 입력이 잘못되었거나 EOF를 눌렀을 때, 조건은'거짓 '입니다. –

+0

첫 번째 예제는'eof()'가 이전 읽기 작업의 상태를 반환하고 스트림의 끝을 읽을 때까지 false를 반환하지 않으므로 실패합니다. –

답변

5

차이점은 >>이 데이터를 먼저 읽은 다음 성공했는지 여부를 알려주는 반면 file.eof()은 읽기 전에 확인합니다. 그렇기 때문에 file.eof() 접근 방식으로 추가 읽기가 가능하며 읽기가 유효하지 않습니다.

당신은 다음과 같이 읽기 후에 장소로 체크를 이동하여 작동하도록하기 위해 file.eof() 코드를 수정할 수 있습니다

// This code has a problem, too! 
while (true) {   // We do not know if it's EOF until we try to read 
    file >> BinaryNumber; // Try reading first 
    if (file.eof()) {  // Now it's OK to check for EOF 
     break;   // We're at the end of file - exit the loop 
    } 
    sum+=decimal(BinaryNumber); 
} 

마지막 데이터 다음에 분리가없는 경우,이 코드가 깨질 것 기입. 따라서 두 번째 방법 (즉, >>의 결과 확인)이 올바른 방법입니다.

편집 :이 게시물은 this comment에 대한 응답으로 편집되었습니다.

+1

둘 다'eof'를 확인합니까, 아니면'>>'버전이'bad'를 확인합니까? – Mehrdad

+2

@Mehrdad'>>'액션은 C++ 11인지 여부에 달렸습니다 : C++ 11 이전에는'operator void *'; C++ 11부터는 operator bool() ([link] (http://stackoverflow.com/a/8117635/335858))을 호출합니다. – dasblinkenlight

+1

사실, 입력을 읽는'eof()'_after_에 대한 점검은 ** 잘못된 것입니다 **! 이번에는 반대 방향으로 오류가 발생합니다. 마지막 값 뒤에 공백이 오지 않으면 처리되지 않습니다. 유일한 올바른 접근법은'file'의 상태, 즉 불리언 값이나'fail()'로의 변환을 검사하는 것입니다. –

2

입력을 테스트 file.eof()를 사용하여, 마지막 입력은 아마도 실패하고 값이 변경되지 않고 유지하고, 따라서 처리 번 : 문자열을 읽을 때, 스트림이 먼저 건너 공백을 선도하고이 공간을 찾을 때까지 문자를 읽고 . 마지막 값 다음에 개행이 있다고 가정하면 스트림은 EOF를 건드리지 않았습니다. 즉, file.eof()true이 아니지만 공백이 아닌 문자가 없으므로 문자열 읽기가 실패합니다.

file >> value을 사용하는 경우 작업이 실행되고 성공했는지 확인하십시오. 항상이 접근 방식을 사용하십시오! eof()의 사용은 읽지 못하는 것이 EOF가 맞았는지 아니면 다른 것이 었는지 결정하는 것입니다.