2017-10-10 179 views
0

我試圖將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。 我應該怎樣才能使這項工作與雙打? 謝謝。

+2

你應該發佈你已經修改的代碼,解釋它做錯了什麼,然後我們可以提供幫助。 –

+2

對不起@SamiKuhmonen,我更新了帖子 – nipunasudha

+0

如果你流入和流出'std :: strstream'而不是寫入文件,你可以做出更好的[mcve]。 –

回答

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 }; 
    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; 
} 

的問題是,其中被投雙打存儲之前燒焦。

+0

謝謝你的迴應,但這樣做帶來了這個錯誤 '錯誤:沒有匹配的函數調用'std :: istreambuf_iterator :: istreambuf_iterator(std :: ifstream&)'' – nipunasudha

+0

你說得對,我會修改回答 – user1754322

+1

你需要'ostream_iterator'有一個分隔符字符串(空格),'istreambuf_iterator'需要成爲'istream_iterator'。這將*不會產生位相同的值(對於一些雙精度值),但它會更接近,並且可能已經足夠好了。 –

相關問題