class Session
{
char predmet[L];
int mark;
public:
...
};
class Student
{
char name[L];
char fak[L];
char group[L];
vector<Session> session;
public:
...
};
Чтение из файла вложенных списков неизвестной длины.
Код:
Нужно писать и читать (в 1 файл) класс Student. Размер вектора session может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
Цитата: burst
Здравствуйте. Вопрос такой.
Нужно писать и читать (в 1 файл) класс Student. Размер вектора session может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
Код:
class Session
{
char predmet[L];
int mark;
public:
...
};
class Student
{
char name[L];
char fak[L];
char group[L];
vector<Session> session;
public:
...
};
{
char predmet[L];
int mark;
public:
...
};
class Student
{
char name[L];
char fak[L];
char group[L];
vector<Session> session;
public:
...
};
Нужно писать и читать (в 1 файл) класс Student. Размер вектора session может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
Необходимо
а) вводить понятие размера структуры - если в файле предполагается хранить структуры разных размеров
б) создать заголовок файла и в нем хранить эти данные
в) использовать XML и хранить там бинарные данные.
Цитата: burst
Здравствуйте. Вопрос такой.
Нужно писать и читать (в 1 файл) класс Student. Размер вектора session может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
Код:
class Session
{
char predmet[L];
int mark;
public:
...
};
class Student
{
char name[L];
char fak[L];
char group[L];
vector<Session> session;
public:
...
};
{
char predmet[L];
int mark;
public:
...
};
class Student
{
char name[L];
char fak[L];
char group[L];
vector<Session> session;
public:
...
};
Нужно писать и читать (в 1 файл) класс Student. Размер вектора session может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
Объясни мне, почему используя std::vector ты не можешь использовать std::string ?
Хранить данные с нефиксированным числом полей можно двумя способами:
1) указывать информацию о количестве полей,
2) ставить разделители и терминаторы,
2.1) ограничивать запись содержащую эти поля тегами, как это делается в XML.
Соотв-но для первого случая формат будет примерно следующим:
Код:
name
fak
group
session_amount
session
session
....
fak
group
session_amount
session
session
....
для второго
Код:
name
fak
group
session
session
....
'end_sessions'
fak
group
session
session
....
'end_sessions'
для 2.1:
Код:
<Student name="Ivanov" fak="1" group="1">
<session predmet="" mark=5 />
<session predmet="" mark=7 />
</Student>
<session predmet="" mark=5 />
<session predmet="" mark=7 />
</Student>
Самым удобным способом будет храниение числа элементов (первый вариант).
Для реализации этого, создаете пару (для чтения и записи) или одну (серриализация, объединяющая обе операции) функцию в классе Student, на вход которой идет файловый поток. Можно также перегрузить операторы << и >>.
Запись делайте по каждому полю, а для вектора сначала пишете его размер, затем содержимое.
При чтении этот размер считываете, меняете на это значение размер вектора и считываете содержимое.
Содержимое вектора (Session) можно читать/писать таким же образом как и Student.
Спасибо, буду пробовать