从文件 C++ 中保存和读取双向量
Posted
技术标签:
【中文标题】从文件 C++ 中保存和读取双向量【英文标题】:Save & read double vector from file C++ 【发布时间】:2017-10-10 09:20:09 【问题描述】:我正在尝试将std::vector<double>
保存到文件中并读取以重建std::vector<double>
。来自 rex (original answer) 的这段代码适用于 std::vector<char>
,但不适用于双打。一旦我尝试修改它以使用双精度数,数字就会丢失小数点。这是我的尝试(修改后的代码)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <vector>
std::string filename("savefile");
std::vector<double> myVector1321.32132,16.32131,32.321,64,3213.454;
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 newVectorread_vector_from_file(filename);
//printing output
std::cout << newVector.at(1) << std::endl;
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<char> osiofs;
std::copy(myVector.begin(),myVector.end(),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::istreambuf_iterator<char> iter(ifs);
std::istreambuf_iterator<char> end;
std::copy(iter,end,std::back_inserter(newVector));
return newVector;
此代码输出 16
而不是 16.32131
。
我应该怎么做才能使这项工作与双打一起工作?
谢谢。
【问题讨论】:
你应该发布你已经修改过的代码,解释它做错了什么,然后我们可以提供帮助。 对不起@SamiKuhmonen,我更新了帖子 如果您在std::strstream
之间进行流式传输而不是写入文件,您可以制作更好的minimal reproducible example。
【参考方案1】:
这应该可行:
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<char> osi ofs ;
const char* beginByte = (char*)&myVector[0];
const char* endByte = (char*)&myVector.back() + sizeof(double);
std::copy(beginByte, endByte, osi);
std::vector<double> read_vector_from_file(std::string filename)
std::vector<char> buffer;
std::ifstream ifs(filename, std::ios::in | std::ifstream::binary);
std::istreambuf_iterator<char> iter(ifs);
std::istreambuf_iterator<char> end;
std::copy(iter, end, std::back_inserter(buffer));
std::vector<double> newVector(buffer.size() / sizeof(double));
memcpy(&newVector[0], &buffer[0], buffer.size());
return newVector;
问题是在存储之前将其转换为 char 的位置加倍。
【讨论】:
感谢您的回复,但这样做会引发此错误error: no matching function for call to ‘std::istreambuf_iterator<double>::istreambuf_iterator(std::ifstream&)’
您需要ostream_iterator
有一个分隔符字符串(空格),并且istreambuf_iterator
需要成为istream_iterator
。这仍然不会产生按位相同的值(对于某些双精度值),但它会更接近,并且可能已经足够好了。以上是关于从文件 C++ 中保存和读取双向量的主要内容,如果未能解决你的问题,请参考以下文章
C++中,读取一系列文件,文件名为1,2,3……,这样,文件名中就会有变量,怎么解决呢