Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Заполнение вектора из файла  (Прочитано 14109 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sd
Постоялец

by
Offline Offline

« : 14-04-2012 17:17 » 

Всем доброго времени суток.
У меня есть два класса (для краткости все методы класса я сюда не кидал, т.к. не несут информационной нагрузки):

Код:
class Checklist
{
public:
friend ostream& operator<<(ostream& stream, Checklist& obj);
friend istream& operator>>(istream& stream, Checklist& obj);
private:
string position;
double percent;
};

В этом классе функции вставки и извлечения перегружены так:

Код:
ostream& operator<<(ostream& stream, Checklist& obj) {
 stream<<obj.position<<'\n'<<obj.percent;
 return stream;
}

istream& operator>>(istream& stream, Checklist& obj) {
 stream>>obj.position;
 stream>>obj.percent;

 return stream;
}

Есть второй класс. В нем вектор из элементов первого класса:

Код:
class Employee
{
public:

friend ostream& operator<<(ostream& stream, Employee& obj);
private:
int number;
string surname;
string firstname;
string post;
double avPercent;
vector <Checklist> checklists;
};

В этом классе функция вставки перегружена так:

Код:
ostream& operator<<(ostream& stream, Employee& obj) {
 stream<<obj.number<<'\n'<<obj.surname<<'\n';
 stream<<obj.firstname<<'\n'<<obj.post<<'\n';
 stream<<obj.avPercent<<'\n';

 int checklistCount=obj.checklists.size();

 if(checklistCount>0)
for(int i=0; i<checklistCount; i++)
stream<<obj.checklists[i]<<'\n';
 stream<<'\n';

 return stream;
 }


В функции main есть вектор из элементов класса Employee. Он там заполняется и сохраняется в файл (см. в аттаче).

В общем, вопрос вот в чем. Как мне потом из этого файла правильно заполнить вектор из объектов класса Employee. Надо сначала как-то узнать сколько записей в файле (каждая новая запись разделена пустой строкой). И еще требуется правильно заполнить вектор элементов класса Checklist.

Надеюсь вопрос понятен. Подскажите как решить проблему.
Спасибо

* test (0.16 Кб - загружено 1025 раз.)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 14-04-2012 17:37 » 

Просто читаеш запись, проверяеш ее на корректность. И затем заносиш ее в вектор. Что то вроде такого
Код:
Employer temp << filestream;
listEmployer.push_back(temp);
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sd
Постоялец

by
Offline Offline

« Ответ #2 : 14-04-2012 17:40 » 

Как проверить ее на коррекьность? Прочитать из файла все поля, кроме вектора checklist не проблема. Вопрос в том, как его заполнить?
Надо как-то перегрузить оператор >> для класса Employee, что бы он корректно заполнял вектор checklists
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 14-04-2012 17:45 » 

Ты как-то пишеш в файл. В той же последовательности читай из файла. На корректность в принципе должен отвечать сам класс (В моем примере Employer).

Добавлено через 5 минут и 20 секунд:
Оператор >> у тебя в дружеских отношениях Улыбаюсь Поэтому он должен аккуратно обрашаться к полям класса. В принципе нужно работать не напрямую через поля, а через их гетеры и сетеры. (методы класса, которые отвечают за заполнения поля и выдачу наружу его содержимого). В Сетерах удобно устраивать проверки на корректность.
« Последнее редактирование: 14-04-2012 17:50 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sd
Постоялец

by
Offline Offline

« Ответ #4 : 14-04-2012 17:50 » 

Когда я пишу в файл, я знаю сколько элментов туда записывать. Когда читаю - нет. Как вариант, записывать в файл количество элментов, потом считывать столько же...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 14-04-2012 17:54 » 

Количество работников для вектора не важно. В нем встроен механизм автоматического расширения. Так что читаеш корректную запись, и заполняеш вектор. Сколько записей не важно. Самое главное следить за индикатором концовки файла.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sd
Постоялец

by
Offline Offline

« Ответ #6 : 14-04-2012 18:45 » 

Спасибо. Разобрался.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 28-05-2012 18:53 » new

http://wiki.shelek.ru/index.php/FAQ:STL:C%2B%2B_%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines