2017-10-10 28 views
0

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

ごめんなさい@SamKuhmonen、投稿を更新しました – 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; 
} 

問題がキャストされているダブルスは格納する前にcharにということでした。

+0

応答していただきありがとうございますが、このエラーが発生しました 'エラー: 'std :: istreambuf_iteratorへの呼び出しに一致する関数がありません :: istreambuf_iterator(std :: ifstream&)' ' – nipunasudha

+0

そうです、 Answer – user1754322

+1

デリミタ文字列(空白)を持つには 'ostream_iterator'が必要です。' istreambuf_iterator'は 'istream_iterator'になる必要があります。これは*まだ*いくつかの二重値のためのビットワイズの同一の値を生成しませんが、それははるかに近くなり、十分に良いかもしれません。 –

関連する問題