2010-01-08 5 views
1

파일에 트리플 벡터를 쓰고 나중에 데이터 구조를 다시 읽을 수 있습니다. 파일을 저장 한 후 다시 읽으려고하면 첫 50 개의 값이 정확하지만 나머지 값은 가비지입니다. 누군가 나를 도와 줄 수 있다면 정말 고맙겠습니다. 고마워요!C++에서 파일 읽기 및 쓰기

파일 선언 :

fstream memory_file("C:\\Users\\Amichai\\Pictures\\output.txt", ios::in | ios::out);  

저장 기능 :

void save_training_data(fstream &memory_file, vector<vector<vector<long double> > > &training_data) 
{ 
    int sizeI = training_data.size(); 
    memory_file.write((const char *)&sizeI, sizeof(int)); 
    for (int i=0; i < sizeI; i++) 
    { 
     int sizeJ = training_data[i].size(); 
     memory_file.write((const char *)&sizeJ, sizeof(int)); 
     for (int j=0; j < sizeJ; j++) 
     { 
      int sizeK = training_data[i][j].size(); 
      memory_file.write((const char *)&sizeK, sizeof(int)); 
      for (int k = 0; k < sizeK; k++) 
      { 
       int temp; 
       temp = (int)training_data[i][j][k]; 
       memory_file.write((const char *)&temp, sizeof(int)); 
      } 
     } 
    } 
} 

읽기 기능 :

void upload_memory(fstream &memory_file, vector<vector<vector<long double> > > &training_data) 
{ 
    memory_file.seekg(ios::beg); 
    int temp=0; 
    int sizeK, sizeJ, sizeI; 
    memory_file.read((char*)&sizeI, sizeof(int)); 
    training_data.resize(sizeI); 
    for (int i=0; i < sizeI; i++) 
    { 
      memory_file.read((char*)&sizeJ, sizeof(int)); 
      training_data[i].resize(sizeJ);   
      for (int j=0; j < sizeJ; j++) 
      { 
       memory_file.read((char*)&sizeK, sizeof(int)); 
       training_data[i][j].resize(sizeK); 
       for (int k = 0; k < sizeK; k++) 
       { 
        memory_file.read((char*)&temp, sizeof(int)); 
        training_data[i][j][k]=temp; 
       } 
      } 
    } 
} 
+0

트리플 벡터의 크기는 무엇입니까? –

답변

3

바이너리 데이터 쓰기 (분명히 Windows에서 작업)하고 있기 때문에 당신이 정말로 fstream을 열 때 ios :: binary를 지정해야합니다.

+0

선언을 fstream memory_file ("C : \\ Users \\ Amichai \\ Pictures \\ output.txt", ios :: in ios :: out | ios :: binary)로 변경하십시오. 작동해야합니다. – anijhaw

0

문제는 스트림 프로세서가 텍스트로 해석 한 파일에 이진 형식의 숫자 값을 쓰고 있다는 것입니다. 바이너리 파일 (ios :: binary 사용)을 사용하거나 파일에 쓰기 전에 숫자를 문자열로 변환하십시오.

0

Boost.Serialization 라이브러리는 www.booost.org입니다. STL 컬렉션을 읽고 쓰는 방법을 알고 있습니다. 그래도 중첩 된 컨테이너를 처리 할 수 ​​있는지 여부는 알 수 없습니다.

또한 Boost.Multiarray를 사용하여 3 차원 데이터를 만들 수도 있습니다. 데이터에서 행렬 연산을 수행하려면 Boost.uBlas를 사용하는 것이 좋습니다.

0

다른 답변은 "ios :: in | ios :: out"대신 "ios :: in | ios :: out"대신 "ios :: in | ios :: binary"를 사용하는 것이 좋습니다. 그러나 나는 C++ 스트림 사양은 바이너리 파일을 위해 설계되지 않았지만 바이너리 옵션을 가지고 있습니다. "ios :: binary"를 사용하면 stdio.h의 C 함수 fopen(), fread(), fwrite() 및 fclose()를 사용해야하거나 다른 사용자가 제안한대로 Boost :: Serilization 라이브러리.