2017-10-10 4 views
0

std::vector<double>을 파일에 저장하려고 시도하고 std::vector<double>을 다시 읽으려고합니다. rex (original answer)의 코드는 std::vector<char>에서 작동하지만 double 값에서는 작동하지 않습니다. 복식으로 작업하도록 수정하면 숫자는 소수점을 잃게됩니다. 여기 내 시도 (수정 된 코드)파일에서 더블 벡터 저장 및 읽기 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.3213116입니다. 두 배로이 작업을하려면 어떻게해야합니까? 감사합니다.

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

문제는 캐스팅 된 두 배는 저장하기 전에 숯불하는 것이 었습니다.

+0

응답 해 주셔서 감사합니다. 그러나이 오류가 발생합니다. 오류 : 'std :: istreambuf_iterator'에 대한 호출에 일치하는 함수가 없습니다. :: istreambuf_iterator (std :: ifstream &) ' – nipunasudha

+0

맞습니다. Answer – user1754322

+1

delimiter string (공백)을 사용하기 위해서는'ostream_iterator'가 필요합니다.'istreambuf_iterator'는'istream_iterator'가 될 필요가 있습니다. 이것은 * 여전히 * 비트 단위의 동일한 값 (일부 이중 값의 경우)을 생성하지 않지만 훨씬 더 가깝고 충분히 좋을 수 있습니다. –