2010-01-08 3 views
1

Я пытаюсь записать тройной вектор в файл и затем после этого вернуться к структуре данных. Когда я пытаюсь прочитать файл после его сохранения, первые пятьдесят значений выдаются правильно, а остальные значения - мусор. Я был бы очень благодарен, если бы кто-то мог помочь мне здесь. Большое спасибо!Чтение и запись в файл в 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) вы действительно вам нужно указать ios :: binary при открытии fstream.

+0

изменить объявление на fstream memory_file ("C: \\ Пользователи \\ Amichai \\ Картинки \\ output.txt", ios :: in | ios :: out | ios :: binary); Он должен работать – anijhaw

0

Проблема заключается в том, что вы записываете числовые значения в двоичной форме в файл, интерпретируемый как текст потоковым процессором. Либо используйте двоичный файл (используя ios :: binary), либо конвертируйте числа в строки перед записью в файл.

0

Ознакомьтесь с библиотекой Boost.Serialization по телефону www.booost.org. Он знает, как читать и писать коллекции STL в/из файлов. Однако я не знаю, может ли он обрабатывать вложенные контейнеры.

Вы также можете использовать Boost.Multiarray для трехмерных данных. Если вы собираетесь делать математическую математику по вашим данным, тогда вы можете использовать Boost.uBlas.

0

Как другие ответы предлагают использовать «ios :: in | ios :: out | ios :: binary» вместо «ios :: in | ios :: out», что верно, однако я помню, что читал, что C++ когда спецификация двоичного файла вообще не предназначена для двоичных файлов. Если использование «ios :: binary» не поможет, вам нужно будет использовать функции C fopen(), fread(), fwrite() и fclose() для stdio.h или, как предлагает другой пользователь, Boost :: Библиотека сериализации.

Смежные вопросы