[問題] fstream eof 的問題 [已解決]

看板C_and_CPP (C/C++)作者 (兩金)時間15年前 (2010/10/19 09:43), 編輯推噓1(1013)
留言14則, 3人參與, 最新討論串1/1
看似簡單的邏輯, 試了很多種方法還是沒有解決, 煩請前輩們指點迷津 m(_._)m 需求 : 讀入一個 .txt 檔案如下 前面是學號, 後面是成績 計算出每個學生個人成績以及各科平均 1001 3.0 2.7 2.0 2.8 1002 3.7 3.5 4.0 4.0 1003 0.0 1.0 2.2 1.0 1004 4.0 3.0 3.5 3.5 問題 : 用 while 設定在 EOF 的時候跳出, 可是程式會把最後一筆資料再讀一次 請問要怎麼加上條件能避免這樣的情形呢 ? 輸出檔案 : 1001 2.625 1002 3.800 1003 1.050 1004 3.500 1004 3.500 <- 會把最後一筆資料再讀一次 Average 1 = 2.940 Average 2 = 2.640 Average 3 = 3.040 Average 4 = 2.960 請按任意鍵繼續 . . . 程式碼 : #include <iostream> #include <fstream> #include <iomanip> #define INPUT_FILE_LOCATION "e:\\InTest.txt" #define OUTPUT_FILE_LOCATION "e:\\OUT.txt" #define ERROR_MSG "Error" using namespace std; int main(){ int studentID; int count=0; double personalAve; double g1, g2, g3, g4; double ave1=0, ave2=0, ave3=0, ave4=0; double sum1=0, sum2=0, sum3=0, sum4=0; fstream inFile(INPUT_FILE_LOCATION); ofstream outFile(OUTPUT_FILE_LOCATION); if(!inFile || !outFile) cout << ERROR_MSG << endl; else{ while (!inFile.eof()){ outFile << fixed << setprecision(3); inFile >> studentID >> g1 >> g2 >> g3 >> g4; personalAve = (g1 + g2 + g3 + g4)/4; outFile << studentID << "\t" << personalAve << endl; count++; sum1 = sum1 + g1; sum2 = sum2 + g2; sum3 = sum3 + g3; sum4 = sum4 + g4; ave1 = sum1 / count; ave2 = sum2 / count; ave3 = sum3 / count; ave4 = sum4 / count; } outFile << "\nAverage 1 = " << ave1 << endl; outFile << "Average 2 = " << ave2 << endl; outFile << "Average 3 = " << ave3 << endl; outFile << "Average 4 = " << ave4 << endl; outFile << "\n\n" ; } inFile.close(); system("PAUSE"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 24.218.207.96

10/19 09:47, , 1F
不要用 EOF 來判斷, 使用 good 會好些, 其他狀況也判
10/19 09:47, 1F

10/19 09:47, , 2F
斷得到, 策略就是先讀完一整行的東西, 再去檢查狀態
10/19 09:47, 2F

10/19 09:50, , 3F
狀態良好, 才處理此行資料
10/19 09:50, 3F

10/19 09:51, , 4F
會不會是因為文字檔多空了一行造成的?
10/19 09:51, 4F

10/19 09:59, , 5F
感謝回應^^, 改成while(inFile.good()) 後可以順利執行
10/19 09:59, 5F

10/19 10:00, , 6F
唯一的罩門是若讀入的txt檔最後一行後面還有空格或是enter
10/19 10:00, 6F

10/19 10:01, , 7F
出來的output還是會多最後一行 XDD 不過已可順利解題 再次感謝
10/19 10:01, 7F

10/19 10:02, , 8F
inFile >> studentID >> g1 >> g2 >> g3 >> g4; 這行
10/19 10:02, 8F

10/19 10:02, , 9F
直接放在while條件判斷裡, 實際上就等於你讀完再判斷
10/19 10:02, 9F

10/19 10:03, , 10F
是否為good, 而且要全部資料都讀完整無誤, 迴圈才會
10/19 10:03, 10F

10/19 10:03, , 11F
執行
10/19 10:03, 11F

10/19 10:03, , 12F
毆!!好的 我再試看看
10/19 10:03, 12F

10/19 10:07, , 13F
判斷那一行的時候 變成若原始檔最後一行的尾巴沒有空格或enter
10/19 10:07, 13F

10/19 10:08, , 14F
就會忽略掉那一行 @@
10/19 10:08, 14F
文章代碼(AID): #1ClFVNWP (C_and_CPP)
文章代碼(AID): #1ClFVNWP (C_and_CPP)