2015-02-13 2 views
0

Мне очень нужна ваша помощь. У меня есть следующие в моем структур код:Запись и загрузка векторных структур в двоичном файле C++

struct Field{ 
     char name[20]; 
     int type; 
     int length; 
    }; 

    struct Record{ 
     vector<Field> structure; 
     vector<string> info; 
    }; 

То, что я хочу сделать, это сохранить вектор моей структуры записи в двоичный файл и успешно загрузить его обратно. Проблема в том, что у моей структуры есть два вектора внутри нее, и они вызывают у меня некоторые проблемы. Можете ли вы мне помочь?

+0

возможно дубликат [как правильно написать вектор в двоичный файл в C++?] (http://stackoverflow.com/questions/14089266/how-to-correctly-write-vector-to-binary-file-in-c) – Pradhan

+0

Как мы можем помочь вам с «некоторыми неприятностями»? Это какая-то проблема, которую вы можете показать нам в своем вопросе? –

ответ

2

Я знаю, что это дубликат, но мне .. Мне было скучно. Вы в основном просто записываете функции, которые будут писать структуру в поток. Сначала вы пишете размер структуры, если это POD.

Если это не POD, вы пишете размер каждого элемента, тогда вы записываете данные для элемента.

Ниже вы можете увидеть для writevecfield, он сначала записывает размер вектора. Затем он записывает всю структуру POD в поток. writevecstring сначала записывает размер вектора. Затем он проходит через вектор и записывает: размер каждой строки, за которой следует ее содержимое.

Чтобы читать, вы делаете обратное. readvecfield считывает размер вектора из файла, потому что это было первое, что написано. Прочитав его, мы изменим размер вектора и прочитаем количество «полей» в новом векторе.

Чтобы прочитать строки, мы делаем все наоборот. readvecstring сначала считывает размер вектора из файла. Он изменяет размер вектора на размер. Затем он зацикливает «размер» количества раз, потому что это количество строк в файле.

Затем мы читаем размер строки, изменяем размер строки и считываем содержимое в эту строку. Затем мы добавим, что к вектору и перейти на следующую строку: прочитайте размер первого, размер строки, прочитать содержимое, добавить в векторе ..

#include <fstream> 
#include <vector> 
#include <iostream> 
#include <sstream> 

using namespace std; 


struct Field 
{ 
    char name[20]; 
    int type; 
    int length; 
}; 

struct Record 
{ 
    vector<Field> structure; 
    vector<string> info; 
}; 

void writevecfield(ostream& os, const vector<Field> &vec) 
{ 
    typename vector<Field>::size_type size = vec.size(); 
    os.write((char*)&size, sizeof(size)); 
    os.write((char*)&vec[0], vec.size() * sizeof(Field)); 
} 

void readvecfield(istream& is, vector<Field> &vec) 
{ 
    typename vector<Field>::size_type size = 0; 
    is.read((char*)&size, sizeof(size)); 
    vec.resize(size); 
    is.read((char*)&vec[0], vec.size() * sizeof(Field)); 
} 

void writevecstring(ostream& os, const vector<string> &vec) 
{ 
    typename vector<string>::size_type size = vec.size(); 
    os.write((char*)&size, sizeof(size)); 

    for (typename vector<string>::size_type i = 0; i < size; ++i) 
    { 
     typename vector<string>::size_type element_size = vec[i].size(); 
     os.write((char*)&element_size, sizeof(element_size)); 
     os.write(&vec[i][0], element_size); 
    } 
} 

void readvecstring(istream& is, vector<string> &vec) 
{ 
    typename vector<string>::size_type size = 0; 
    is.read((char*)&size, sizeof(size)); 
    vec.resize(size); 

    for (typename vector<string>::size_type i = 0; i < size; ++i) 
    { 
     typename vector<string>::size_type element_size = 0; 
     is.read((char*)&element_size, sizeof(element_size)); 
     vec[i].resize(element_size); 
     is.read(&vec[i][0], element_size); 
    } 
} 



void WriteRecord(ostream& out, const Record& r) 
{ 
    writevecfield(out, r.structure); 
    writevecstring(out, r.info); 
} 

void ReadRecord(istream& in, Record& r) 
{ 
    readvecfield(in, r.structure); 
    readvecstring(in, r.info); 
} 


int main() 
{ 
    Record R; 

    Field first = {"HELLO", 1, 20}; 
    Field second = {"WORLD", 2, 40}; 
    R.structure.push_back(first); 
    R.structure.push_back(second); 
    R.info.push_back("INFO FOR HELLO"); 
    R.info.push_back("INFO FOR WORLD"); 

    std::ofstream out("C:/Users/***/Desktop/Test.bin", std::ios::out | std::ios::binary); 
    WriteRecord(out, R); 
    out.close(); 

    Record RR; 
    std::ifstream in("C:/Users/***/Desktop/Test.bin", std::ios::in | std::ios::binary); 
    ReadRecord(in, RR); 
    in.close(); 

    for (int i = 0; i < RR.structure.size(); ++i) 
    { 
     std::cout<<"Name: "<<RR.structure[i].name<<"\n"; 
     std::cout<<"Type: "<<RR.structure[i].type<<"\n"; 
     std::cout<<"Length: "<<RR.structure[i].length<<"\n"; 
     std::cout<<"INFO: "<<RR.info[i]<<"\n\n"; 
    } 
} 
Смежные вопросы