从文件 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&lt;double&gt;::istreambuf_iterator(std::ifstream&amp;)’ 您需要ostream_iterator 有一个分隔符字符串(空格),并且istreambuf_iterator 需要成为istream_iterator。这仍然不会产生按位相同的值(对于某些双精度值),但它会更接近,并且可能已经足够好了。

以上是关于从文件 C++ 中保存和读取双向量的主要内容,如果未能解决你的问题,请参考以下文章

C++中,读取一系列文件,文件名为1,2,3……,这样,文件名中就会有变量,怎么解决呢

如何使用 C++ 在 .txt 文件中写入、读取和重写

使用 HDF5 保存要在 C++ 中读取的 MATLAB 结构

关于c++文件流读入和写入的问题

无法从 Word (Apache POI) 读取双向字符串

读取 .csv 文件 C++ 时的 Atoi 函数