2012-03-30 188 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'標誌不預測未來。它不會告訴你未來的閱讀是否會成功,但只是爲什麼過去的閱讀失敗。您需要使用讀取功能,以便您可以處理故障,然後僅在兩個文件都失敗時停止。 – 2012-03-30 18:13:23

+0

謝謝你的迴應,David。我對C++比較陌生。有沒有可能演示你在說什麼? – 2012-03-30 18:14:37

+2

請參閱[本頁](http://mathbits.com/mathbits/compsci/files/end.htm),以獲取如何讀取數據的示例,以便您可以處理故障,然後僅在讀取數據時處理數據成功了。 – 2012-03-30 18:16:05

回答

1

請注意,你也有無限循環:

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

沒有什麼是內循環改變,以使文件1至接近EOF()。

+0

由於'break',沒有任何循環。 – 2012-03-30 18:46:10

+0

哎呀 - 無限循環在另一種情況下: if(file1.eof()){ do { fout << numbers2 << endl; } while(!file2.eof()); break; } – DRVic 2012-03-30 21:29:22