2017-10-10 8 views
0

J'essaie d'enregistrer un std::vector<double> dans un fichier et lire pour reconstruire le std::vector<double>. Ce code de rex (original answer) fonctionne pour std::vector<char> mais pas pour les doubles. Une fois que j'ai essayé de modifier cela pour travailler avec des doubles, les nombres perdent des points décimaux. Voici ma tentative (code modifié)Enregistrer et lire double vecteur à partir du fichier 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; 
} 

Ce sorties de code 16 au lieu de 16.32131. Que dois-je faire pour que cela fonctionne avec les doubles? Merci.

+2

Vous devriez publier le code que vous avez déjà modifié, expliquer ce qu'il fait mal et nous pouvons vous aider. –

+2

désolé @SamiKuhmonen, j'ai mis à jour le poste – nipunasudha

+0

Vous pourriez faire un meilleur [mcve] si vous flux vers et depuis un 'std :: strstream' au lieu d'écrire des fichiers. –

Répondre

0

Cela devrait fonctionner:

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

Le problème était que double où d'être jeté sur char avant de le ranger.

+0

Merci pour la réponse, mais cela fait ressortir cette erreur 'erreur: pas de fonction correspondante pour l'appel à 'std :: istreambuf_iterator :: istreambuf_iterator (std :: ifstream &)'' – nipunasudha

+0

Vous avez raison, je vais modifier le answer – user1754322

+1

Vous avez besoin du 'ostream_iterator' pour avoir une chaîne de délimitation (espace), et le' istreambuf_iterator' devra devenir un 'istream_iterator'. Cela ne produira * toujours * pas de valeurs identiques au niveau des bits (pour certaines valeurs doubles), mais cela sera beaucoup plus proche, et cela peut être suffisant. –