【问题标题】:reading from ifstream file gives wrong size [duplicate]从 ifstream 文件中读取会给出错误的大小 [重复]
【发布时间】:2014-08-26 15:38:34
【问题描述】:

我有一个 .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();

【问题讨论】:

  • ...不要使用endl,除非你真的想要一个缓冲区刷新(以~10:1的速度损失)以及写一个新行字符。
  • 如果错误的流包含非数字数据,如普通文本,你会得到一个无限循环。最终在耗尽内存时崩溃。

标签: c++ vector stl ifstream


【解决方案1】:

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

做:

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

【讨论】:

  • 我尝试了这种方法,但得到了 3145728,返回了实际大小的一半。
  • @user3921720 查看我对完整循环的编辑,您在while 中做的disparity_txt &gt;&gt; disparity; 太多了。希望这会有所帮助。
【解决方案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}}, {});

【讨论】:

  • +1 用于建议替代方案(我个人更喜欢 C++03 解决方案,我觉得它更具可读性)
  • quantdev 的答案更好,因为它实际上解释了问题,我的只是提供了一个替代解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多