2012-03-30 6 views
0

숫자 목록이 들어있는 텍스트 파일을 읽는 프로그램을 작성 중입니다. 이 목록에는 일련의 정렬 된 숫자가 있으며 각 숫자에는 다양한 양의 값이 포함될 수 있습니다. 예를 들어, 파일 1에는 2 개의 숫자 목록이 있고 파일 2에는 20의 목록이있을 수 있습니다.C++ eof() 후 파일 읽기 계속 하시겠습니까?

프로그램의 요점은 각 텍스트 파일 (오름차순으로 숫자 포함)을 한 줄씩 읽는 것입니다 그런 다음 새 텍스트 파일에 오름차순으로 넣습니다. 그러나 하나의 목록이 매우 짧으면 eof() 오류가 발생하여 파일 판독기가 실패 상태가되어 긴 텍스트 파일의 나머지 값을 읽을 수 없습니다. 여기

내 코드 인 두 개의 텍스트 파일을 반복 :

int main() { 
int numbers1 = 0, numbers2 = 0, fillCounter = 0, iteration = 0; 
char grabNext = 'b'; 
ifstream file1, file2, fileFiller; 
ofstream fout; 
file1.open("numbers1.txt"); 
file2.open("numbers2.txt"); 
fout.open("output.txt"); 

//Check and see if the opening operation was successful 
if (file1.fail() || file2.fail()) { 
    cout << "The progran could not open the related necessary files. Check and see if they exist!" 
     << endl; 

    exit(1); 
} 

do { 
//In theory, whenever the file1 gives an eof, I should be able to iterate over the remaining lines of file2 
    if (file1.eof()) { 
     do { 
      fout << numbers2 << endl; 
     } while(!file2.eof()); 

     break; 
    } 

//In theory, whenever the file2 gives an eof, I should be able to iterate over the remaining lines of file1 
    if (file2.eof()) { 
     do { 
      fout << numbers1 << endl; 
      break; 
     } while(!file1.eof()); 

     break; 
    } 

    if (grabNext == 'b') { 
     file1 >> numbers1; 
     file2 >> numbers2; 
    } else if (grabNext == 'l') { 
     file1 >> numbers1; 
    } else if (grabNext == 'u') { 
     file2 >> numbers2; 
    } 

    cout << numbers1 << " " << numbers2 << endl; 

    if (numbers1 < numbers2) { 
     fout << numbers1 << endl; 
     grabNext = 'l'; 
    } else if (numbers1 > numbers2) { 
     fout << numbers2 << endl; 
     grabNext = 'u'; 
    } 

    iteration++; 
} while(true); 

} 여기

예를 텍스트 파일 1 :

여기
-1 
3 
5 
7 
9 

예를 들어 텍스트 파일 (2)가된다

2 
4 
10 
12 
16 

내 질문은 하나의 파일에서 eof()에 도달하면 그 파일이 eof()에 도달 할 때까지 다른 파일을 계속 읽을 수 있다는 것입니다.

나는 어디서나 운이 없다.

감사합니다. 당신은 또한 무한 루프가

+1

'eof' 플래그는 미래를 예측하지 않습니다. 미래의 읽기가 성공할 지 여부는 알려주지 않지만 과거의 읽기가 실패한 이유 만 알려줍니다. 실패를 처리하고 두 파일이 모두 실패한 경우에만 중지 할 수있는 읽기 기능을 사용해야합니다. –

+0

답변 해 주셔서 감사합니다, David. 나는 C++에 비교적 익숙하지 않다. 당신이 말하는 것에 대해 데모 할 수있는 기회가 있습니까? –

+2

실패를 처리하고 읽은 데이터 만 처리 할 수있는 방식으로 데이터를 읽는 방법에 대한 예는 [이 페이지] (http://mathbits.com/mathbits/compsci/files/end.htm)를 참조하십시오. 성공했다. –

답변

1

참고 :

do { 
     fout << numbers1 << endl; 
     break; 
    } while(!file1.eof()); 

아무것도 루프 내부에 변경되지는 EOF에 접근하는 파일 1을 유발하는().

+0

'break;'로 인해 루프가 존재하지 않습니다. –

+0

으악 - 무한 루프는 다른 경우입니다. if (file1.eof()) { do { fout << numbers2 << endl; } while (! file2.eof()); 휴식; } – DRVic