C++讀取文件爲何會多讀一行?

近來在做概率統計的作業,由於手算均值中值什麼的,還有畫莖葉圖太麻煩,所以寫了個小程序。但是當我算到最後時卻發現這個小程序有一個bug,然後就gg了。這個bug大概是這樣的:
錯誤示例

原本在data.txt中只有三個數,讀到內存中卻有四個數。
正確的結果應該是這樣:

正確示例

出事的代碼如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ifstream ff;
    ff.open("data.txt");
    vector<double> data;
    data.clear();
    double sum = 0;
    double temp = 0;
    while (ff >> temp) {
        data.push_back(temp);
        sum += temp;
    }
    // 這裏就是錯誤的代碼
    /*while (!ff.eof()) {
        ff >> temp;
        data.push_back(temp);
        sum += temp;
    }*/
    ...
    ...

然後我就上網查了相關資料,發現也有許多人遇到了和我同樣的問題。
經過研究這個問題的產生原因我推測大概是這樣的。
其實ff.eof() 就是判斷是否讀到一個文件結束的標誌,然後當讀到最後一行的最後一個數的時候,其實要再讀一次才能讀到那個標誌,這時程序再次進入循環,但是這時ff>>temp 其實是讀取失敗了,所以temp還是之前那個值,就導致了最後一個值被push了兩次

所以正確的解決方法就是:

while (ff >> temp) {
        data.push_back(temp);
        sum += temp;
    }

這樣的話,如果ff>>temp 這句不成功,就不會進入循環了。


其實概統還是應該用Matlab做的,用C++簡直作死:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章