加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:36:34 所属栏目:百科 来源:网络整理
导读:我试图理解 here提供的答案,但我似乎无法使其发挥作用. 这是我尝试过的: #include algorithm#include iostream#include iterator#include vector#include fstreamint main(){ std::string path("numbersfile"); std::vectorint myVector{1,16,32,64}; std::
我试图理解 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仍为空.如何更新最后一个语句以填充newVector?

解决方法

在调用第二个副本时,文件尚未准备好读取. (感谢Piotr Skotnicki在评论中的回答)

拨打flush可以使程序正常工作:

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

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

    std::vector<int> myVector{1,std::ostreambuf_iterator<char>(FILE));
    FILE.flush(); // required here

    std::ifstream INFILE(path,std::back_inserter(newVector)); // this leaves newVector empty
    return 0;
}

创建ifstream时,ofstream仍在范围内.如果已经调用了ofstream的析构函数,那么该文件也已经为ifstream做好了准备.在以下程序中,ifstream会自动销毁:

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

std::string filename("numbersfile");

std::vector<double> myVector{1.342,16.33,32.1,12364};

void write_vector_to_file(const std::vector<double>& myVector,std::string filename);
std::vector<double> read_vector_from_file(std::string filename);

int main()
{
    write_vector_to_file(myVector,filename);
    auto newVector{read_vector_from_file(filename)};
    return 0;
}

void write_vector_to_file(const std::vector<double>& myVector,std::string filename)
{
    std::ofstream ofs(filename,std::ios::out | std::ofstream::binary);
    std::ostream_iterator<double> osi{ofs," "};
    std::copy(myVector.begin(),osi);
}

std::vector<double> read_vector_from_file(std::string filename)
{
    std::vector<double> newVector{};
    std::ifstream ifs(filename,std::ios::in | std::ifstream::binary);
    std::istream_iterator<double> iter{ifs};
    std::istream_iterator<double> end{};
    std::copy(iter,end,std::back_inserter(newVector));
    return newVector;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读