从ifstream文件读取错误的大小

时间:2014-08-26 15:38:34

标签: c++ vector stl ifstream

我有一个包含6291456个数字的.txt文件,没有别的。在读出全部并将push_back读入向量后,vector.size()函数返回6291457.此附加元素来自何处?

    int disparity;
    ifstream disparity_txt;
    disparity_txt.open(path);
    while(!disparity_txt.eof())
    {
        disparity_txt >> disparity;
        vec_disparities.push_back(disparity);
    }
    cout << vec_disparities.size() << endl;
    disparity_txt.close();

2 个答案:

答案 0 :(得分:5)

不要使用while(!disparity_txt.eof()) it does not do what you thinkeof只会在读取流结束后设置,因此通常最后一次迭代是错误的):

做:

while(disparity_txt >> disparity)
{
    vec_disparities.push_back(disparity);
}

答案 1 :(得分:2)

使用while (!in.eof()) 几乎总是错误的

从流中提取数字时停止循环失败(如quantdev的回答所示)或使用用于从流中填充容器的标准库工具:

std::ifstream disparity_txt(path);
vec_disparities.assign(std::istream_iterator<int>(disparity_txt),
                       std::istream_iterator<int>());

你可以使用它的构造函数打开一个fstream,析构函数会关闭它,你不需要明确的openclose调用。

在C ++ 11中,它甚至更简单:

vec_disparities.assign(std::istream_iterator<int>{std::ifstream{path}}, {});