Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение из файла вложенных списков неизвестной длины.

1.9K
15 декабря 2007 года
burst
94 / / 04.09.2006
Здравствуйте. Вопрос такой.
Код:
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 может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?
1
15 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: burst
Здравствуйте. Вопрос такой.
Код:
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 может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?



Необходимо
а) вводить понятие размера структуры - если в файле предполагается хранить структуры разных размеров
б) создать заголовок файла и в нем хранить эти данные
в) использовать XML и хранить там бинарные данные.

3
15 декабря 2007 года
Green
4.8K / / 20.01.2000
Цитата: burst
Здравствуйте. Вопрос такой.
Код:
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 может быть произвольным. Как же можно не зная размер структуры данных, прочитать ее из файла?


Объясни мне, почему используя std::vector ты не можешь использовать std::string ?

Хранить данные с нефиксированным числом полей можно двумя способами:
1) указывать информацию о количестве полей,
2) ставить разделители и терминаторы,
2.1) ограничивать запись содержащую эти поля тегами, как это делается в XML.

Соотв-но для первого случая формат будет примерно следующим:

 
Код:
name
fak
group
session_amount
session
session
....

для второго
 
Код:
name
fak
group
session
session
....
'end_sessions'

для 2.1:
 
Код:
<Student name="Ivanov" fak="1" group="1">
    <session predmet="" mark=5 />
    <session predmet="" mark=7 />
</Student>
505
16 декабря 2007 года
vAC
343 / / 28.02.2006
burst,у меня создалось такое впечатление, что вы под "чтением/записью класса" подразумеваете непосредственное обращение к памяти, занимаемой объектом класса...
Самым удобным способом будет храниение числа элементов (первый вариант).
Для реализации этого, создаете пару (для чтения и записи) или одну (серриализация, объединяющая обе операции) функцию в классе Student, на вход которой идет файловый поток. Можно также перегрузить операторы << и >>.
Запись делайте по каждому полю, а для вектора сначала пишете его размер, затем содержимое.
При чтении этот размер считываете, меняете на это значение размер вектора и считываете содержимое.
Содержимое вектора (Session) можно читать/писать таким же образом как и Student.
1.9K
16 декабря 2007 года
burst
94 / / 04.09.2006
Спасибо, буду пробовать
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог