2011-05-01 2 views
2

ifstream을 사용하여 파일을 읽을 때 파일의 모든 줄을 반복하여 닫습니다. 그런 다음 동일한 ifstream 개체를 사용하여 다른 파일을 열려고 시도하면 여전히 파일 끝 오류가 발생합니다. 왜 파일을 닫아도 자동으로 상태를 지우지 않을지 궁금합니다. clear()close() 다음에 분명히 호출해야합니다.파일을 닫으면 오류 상태가 자동으로 지워지지 않는 이유는 무엇입니까?

왜 이런 식으로 디자인 했나요? 다른 파일에 대해 fstream 객체를 재사용하고 싶다면 나에게 정말 고통 스럽다.

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

void main() 
{ 
    ifstream input; 
    input.open("c:\\input.txt"); 

    string line; 
    while (!input.eof()) 
    { 
     getline(input, line); 
     cout<<line<<endl; 
    } 

    // OK, 1 is return here which means End-Of-File 
    cout<<input.rdstate()<<endl; 

    // Why this doesn't clear any error/state of the current file, i.e., EOF here? 
    input.close(); 

    // Now I want to open a new file 
    input.open("c:\\output.txt"); 

    // But I still get EOF error 
    cout<<input.rdstate()<<endl; 

    while (!input.eof()) 
    { 
     getline(input, line); 
     cout<<line<<endl; 
    } 
} 
+0

왜 출력^_ ^을 (를) 읽으시겠습니까? – alternative

+0

@mathepic, 출력 파일은 항상 읽을 수 있지만 입력 파일을 쓸 수는 없습니다. 어쨌든 그 이름은 중요하지 않아야합니다 :) –

+0

필자는 "input.txt"에 확실히 쓸 수 있으며 "output.txt"에서 읽을 수 있습니다.하지만 확실히 이상한 일이 아닌 것 같습니까? – alternative

답변

3

close에 대한 호출이 실패 할 수 있습니다. 실패하면 failbit을 설정합니다. 스트림의 상태를 재설정하면 close에 대한 호출이 성공했는지 여부를 확인할 수 없습니다.

+1

OK ..하지만 닫을 수없는 경우에만 상태를 설정할 수 있습니다. –

+0

그렇다면 현재의 구현에서는 성공을위한 단 하나의 테스트 인 반면 실패에 대한 모든 조건을 테스트해야합니다. – Dikei

+0

그러나 누구도 가까운 실패를 테스트합니까? 나는 결코하지 않는다는 것을 나는 안다. 실패하면 어떻게합니까? –

1

플래그가 파일이 아닌 스트림과 연결되어 있기 때문입니다.

5

저는 개인적으로 close()가 플래그를 재설정해야한다고 생각합니다. 과거에 이것에 의해 물 렸습니다. 또, 여러 번 내 취미 말을 마운트하여 읽기 코드가 잘못 :

while (getline(input, line)) 
{ 
    cout<<line<<endl; 
} 

이유를 확인하려면 당신이 완전히 빈 파일을 읽으려고하면 어떻게되는지 고려해야합니다

while (!input.eof()) 
{ 
    getline(input, line); 
    cout<<line<<endl; 
} 

이 있어야한다 . eof() 호출은 false를 반환합니다 (파일은 비어 있지만 아직 아무것도 읽지 않았으며 eof 비트를 읽는 것만 읽기 때문에). 존재하지 않는 행을 출력합니다.

+0

좋은 지적입니다. 고마워요. –

0

이것은 C++ 11 (C++ 0x)에서 변경되었으므로 close()는 발견 된 오류를 무시하지만 다음 open() 으로 call clear()를 호출합니다.

관련 문제