Я знаю, что это дубликат, но мне .. Мне было скучно. Вы в основном просто записываете функции, которые будут писать структуру в поток. Сначала вы пишете размер структуры, если это 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";
}
}
возможно дубликат [как правильно написать вектор в двоичный файл в C++?] (http://stackoverflow.com/questions/14089266/how-to-correctly-write-vector-to-binary-file-in-c) – Pradhan
Как мы можем помочь вам с «некоторыми неприятностями»? Это какая-то проблема, которую вы можете показать нам в своем вопросе? –