使用迭代器正确读取和写入std :: vector到文件中

时间:2016-04-08 17:58:34

标签: c++ c++11

我正在尝试理解here提供的答案,但我似乎无法使其发挥作用。

这是我尝试过的:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <fstream>

int main()
{
    std::string path("numbersfile");

    std::vector<int> myVector{1,16,32,64};
    std::vector<int> newVector{};

    std::ofstream FILE(path,std::ios::out | std::ofstream::binary);
    std::copy(myVector.begin(),myVector.end(),std::ostreambuf_iterator<char>(FILE));

    std::ifstream INFILE(path,std::ios::in | std::ifstream::binary);
    std::istreambuf_iterator<char> iter(INFILE);
    //std::copy(iter.begin(),iter.end(),std::back_inserter(newVector)); //this doesn't compile
    std::copy(iter,std::istreambuf_iterator<char>{},std::back_inserter(newVector)); // this leaves newVector empty
}
在最后一次newVector之后,

copy仍为空。如何更新最后一个语句以填充newVector

1 个答案:

答案 0 :(得分:5)

您的代码中存在许多缺陷:

  1. 你定义了一个名为FILE 的变量,这个很糟糕坏了FILE是已存在对象的名称,与将vector的实例命名为:std::vector<int>array{}相当。
    它不仅令人困惑,而且非常危险,因为它几乎可以肯定地导致命名冲突。此外,所有国会大厦名称都应为宏保留。

  2. 您永远不会检查文件是否实际打开,如果不是,编译器将不会警告您,并且流不会给出任何失败指示(除非明确检查)。所以,你应该经常检查。最简单的方法是使用流布尔运算符:
    if (!ifile) throw std::runtime_error("error opening file");

  3. 你写道,这不能编译:

      

    std::copy(iter.begin(),iter.end(),std::back_inserter(newVector));

    为什么会这样?迭代器本身没有beginend函数,与迭代器关联的对象具有这些方法。

  4. 将所有内容拼凑在一起是代码的修改版本:

    {
        std::string path("numbersfile");
    
        std::vector<int> myVector{ 1,16,32,64 };
        std::vector<int> newVector{};
    
    
        std::ofstream outfile(path, std::ios_base::binary);
        std::copy(myVector.begin(), myVector.end(), std::ostreambuf_iterator<char>(outfile));
    
        outfile.close(); 
    
        std::ifstream infile(path,std::ios_base::binary);
        std::istreambuf_iterator<char> iter(infile);
        std::copy(iter, std::istreambuf_iterator<char>(),    std::back_inserter(newVector)); // this leaves newVector empty
    
        infile.close(); // close explicilty for consistency 
    }