我试图理解
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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。