保存并读取文件C++中的双向量
我试图将std::vector<double>
保存到文件并读取以重建std::vector<double>
。此代码来自rex(original answer)适用于std::vector<char>
,但不适用于双打。一旦我试图修改这个以使用双打,数字就会丢失小数点。这是我尝试(修改后的代码)保存并读取文件C++中的双向量
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <vector>
std::string filename("savefile");
std::vector<double> myVector{1321.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 newVector{read_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> osi{ofs};
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
。 我应该怎样才能使这项工作与双打? 谢谢。
这应该工作:
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;
}
的问题是,其中被投双打存储之前烧焦。
谢谢你的回应,但这样做带来了这个错误 '错误:没有匹配的函数调用'std :: istreambuf_iterator
你说得对,我会修改回答 – user1754322
你需要'ostream_iterator'有一个分隔符字符串(空格),'istreambuf_iterator'需要成为'istream_iterator'。这将*不会产生位相同的值(对于一些双精度值),但它会更接近,并且可能已经足够好了。 –
你应该发布你已经修改的代码,解释它做错了什么,然后我们可以提供帮助。 –
对不起@SamiKuhmonen,我更新了帖子 – nipunasudha
如果你流入和流出'std :: strstream'而不是写入文件,你可以做出更好的[mcve]。 –