2016-07-30 11 views
1

이 개 파일이 file1는 두 번째 경우에 x 잘못 동안 1 파일C++ 2 개 연속 <code>freopen</code>의를하는 동안 내가 얻을 오류 오류

int x, y; 
freopen("file1", "r", stdin); 

while (cin >> x) { 
    cin >> y; 
} 

freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

인쇄 데이터가 잘 작동하는 int 짝수를 포함 freopen을,

끝까지 도달하기 전에 첫 번째 루프에서 깨진 경우 모든 것이 정상적으로 작동합니다.

여기에 cin의 증상은 무엇입니까? 문제의

+0

freopen을은 C 라이브러리 함수가 아니라 C++ 라이브러리 기능입니다. –

+0

분명히'stdin'의 파일 끝 (end-of-file) 조건이 붙어서'freopen'에 의해 지워지지 않습니다. 그것의 매뉴얼 페이지는 예상 된 행동에 대해 침묵합니다. 명시 적으로'clearerr()'을 호출하여이 작업을 할 수 있어야합니다. –

+0

cin과 >>가 definitievly C++이고 freopen과 stdin이 C 표준 라이브러리에 속해 있음에도 불구하고 C++에서 사용할 수 있습니다 – Christophe

답변

2

원인 :

문제는 C++ 라이브러리 C 라이브러리의 혼합에서 온다.

freopen()stdin에서 잘 작동합니다. scanf()을 사용하여 동일한 코드를 작성하여 stdin에서 직접 읽으면 완벽하게 작동합니다. 그러나 프로그램은 stdin을 읽지 않습니다 : cin is synchronized with stdin이라는 사실을 사용하여 cin에서 입력을 추출합니다. (가) 두 번째 기본 표준 입력에 재개에도 불구하고

불행하게도, an error state flag 상기 제 1 파일 FO 끝에 cin 스트림에 설정되어 eof()로, 유지됩니다.

그것을 해결하는 방법 :

을 그냥 CIN cin.clear()와의 상태를 재설정해야 :

while (cin >> x) { 
    cin >> y; 
} 
cin.clear(); // <============= add this 
freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

제안 :

재생하는 C++에서 필요가 없습니다 cin을 통해 파일을 읽는 stdin. istream을 사용하여 코드를 작성하십시오. 그런 다음 cin 또는 ifstream A의 중이 코드를 사용할 수 있습니다

void process_input(istream &is) 
{ 
    int x, y; 
    while (is >> x) 
     cout <<x<<endl; 
} 
int main() 
{ 
    ifstream ifs1("file1"); 
    process_input (ifs1); // or cin if you prefer 
    ifstream ifs2("file2"); 
    process_input (ifs2); 
}