从ifstream文件读取时给出了错误的大小

reading from ifstream file gives wrong size

本文关键字:错误 ifstream 文件 读取      更新时间:2023-10-16

我有一个.txt文件,其中包含6291456个数字,没有其他内容。在将全部读出和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();

不要使用while(!disparity_txt.eof()),它不会按照您的想法执行(eof只有在读取流的末尾后才会设置,所以通常最后一次迭代是错误的):

Do:

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

使用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}}, {});