C++读取文件为何会多读一行?

近来在做概率统计的作业,由于手算均值中值什么的,还有画茎叶图太麻烦,所以写了个小程序。但是当我算到最后时却发现这个小程序有一个bug,然后就gg了。这个bug大概是这样的:
C++读取文件为何会多读一行?_第1张图片

原本在data.txt中只有三个数,读到内存中却有四个数。
正确的结果应该是这样:

C++读取文件为何会多读一行?_第2张图片

出事的代码如下:

#include 
#include 
#include 
#include 

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++简直作死:)

你可能感兴趣的:(C++)