近來在做概率統計的作業,由於手算均值中值什麼的,還有畫莖葉圖太麻煩,所以寫了個小程序。但是當我算到最後時卻發現這個小程序有一個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++簡直作死:)