Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2012, 19:36   #1
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию Пример из книги Лафоре - если выйти из программы и зайти снова, то прочесть предыдущее сохранение не получается

Здравствуйте! Всё запоминается и записывается в файл, работает как должно, вот только если выйти из программы и зайти снова, то прочесть предыдущее сохранение не получается. Вот листинг:
Цитата:
const int LEN = 32;
const int MAXEM = 100;

enum employee_type{tmanager, tscientist, tlaborer};

class employee
{
private:
char name[LEN];
unsigned long number;
static int n;
static employee* arrap[];
public:
virtual void getdata()
{
cin.ignore(10, '\n');
cout << "Enter surname: "; cin >> name;
cout << "Enter number: "; cin >> number;
}
virtual void putdata()
{
cout << "\n Surname: " << name << endl;
cout << " Number: " << number << endl;
}
virtual employee_type get_type();
static void add();
static void display();
static void read();
static void write();
};

int employee::n;
employee* employee::arrap[MAXEM];

class manager: public employee
{
private:
char title[LEN];
double dues;
public:
void getdata()
{
employee::getdata();
cout << " Enter title: "; cin >> title;
cout << " Enter tax: "; cin >> dues;
}
void putdata()
{
employee:utdata();
cout << " Title: " << title << endl;
cout << " Tax for golf club: " << dues << endl;
}
};

class scientist: public employee
{
private:
int pubs;
public:
void getdata()
{
employee::getdata();
cout << "Enter number of publications: "; cin >> pubs;
}
void putdata()
{
employee:utdata();
cout << "Number of publications: " << pubs << endl;
}
};

class laborer: public employee
{};

void employee::add()
{
char ch;
cout << "'m' - for add manager"
<< "\n's' - for add scientist"
<< "\n'l' - for add laborer"
<< "\nYour choice: ";
cin >> ch;
switch(ch)
{
case 'm': arrap[n] = new manager; break;
case 's': arrap[n] = new scientist; break;
case 'l': arrap[n] = new laborer; break;
default: cout << "Unknown type of worker!" << endl; return;
}
arrap[n++]->getdata();
}

void employee:isplay()
{
for(int j = 0; j < n; j++)
{
cout << (j + 1) << ". Type: ";
switch(arrap[j]->get_type())
{
case tmanager:
cout << "Manager"; break;
case tscientist:
cout << "Scientist"; break;
case tlaborer:
cout << "Laborer"; break;
default:
cout << "Unknown"; break;
}
arrap[j]->putdata();
cout << endl;
}
}

employee_type employee::get_type()
{
if(typeid(*this) == typeid(manager))
return tmanager;
if(typeid(*this) == typeid(scientist))
return tscientist;
if(typeid(*this) == typeid(laborer))
return tlaborer;
else
{cerr << "Wrong type of worker!"; exit(1);}
exit(1);
}

void employee::write()
{
int size;
cout << "Writing in progress... " << n << " workers.\n";
ofstream ouf;
employee_type etype;

ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
if(!ouf)
{
cout << "Impossible open file!" << endl;
return;
}
for(int j = 0; j < n; j++)
{
etype = arrap[j]->get_type();
ouf.write(reinterpret_cast<char*>(& etype), sizeof(employee_type));
switch(etype)
{
case tmanager:
size = sizeof(manager); break;
case tscientist:
size = sizeof(scientist); break;
case tlaborer:
size = sizeof(laborer); break;
}
ouf.write(reinterpret_cast<char*>(a rrap[j]), size);
if(!ouf)
{cout << "\nWrite data in file impossible!\n"; return;}
}
ouf.close();
}

void employee::read()
{
int size;
employee_type etype;
ifstream inf;
inf.open("EMPLOY.DAT", ios::binary);
inf.seekg(0, ios::beg);
if(!inf)
{cout << "Impossible to open file!"; return;}
n = 0;
while(true)
{
inf.read(reinterpret_cast<char*>(&e type), sizeof(employee_type));
if(inf.eof())
break;
if(!inf)
{cout << "Impossible read type!"; return;}
switch(etype)
{
case tmanager:
arrap[n] = new manager; size = sizeof(manager); break;
case tscientist:
arrap[n] = new scientist; size = sizeof(scientist); break;
case tlaborer:
arrap[n] = new laborer; size = sizeof(laborer); break;
default:
{cout << "\nUnknown type in file\n"; return;}
}
inf.read(reinterpret_cast<char*>(ar rap[n]), size);
if(!inf)
{cout << "\nReading data from file is impossible!\n"; return;}
n++;
}
cout << "Reading " << n << " workers!\n";
inf.close();
}

int _tmain(int argc, _TCHAR* argv[])
{
char ch;
while(true)
{
cout << "'a' - add data of worker"
<< "\n'd' - show data of all workers"
<< "\n'w' - write all data in file"
<< "\n'r' - read all data from file"
<< "\n'x' - exit"
<< "\nYour choice: ";
cin >> ch;
switch(ch)
{
case 'a':
employee::add(); break;
case 'd':
employee:isplay(); break;
case 'w':
employee::write(); break;
case 'r':
employee::read(); break;
case 'x':
exit(0);
default:
cout << "Unknown command!";
}
}
return 0;
}
Асурус вне форума Ответить с цитированием
Старый 04.11.2012, 23:43   #2
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

Или все ленивые или вопрос крутой.
Асурус вне форума Ответить с цитированием
Старый 04.11.2012, 23:52   #3
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

О боги, пожалейте глаза наши.. итак ни к чёрту.
отформатировал..(
Вложения
Тип файла: zip prog.zip (1.5 Кб, 18 просмотров)
Murashov вне форума Ответить с цитированием
Старый 05.11.2012, 00:57   #4
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию Не помогло...

Спасибо за труды, но ничего не работает как и раньше. Там же ошибка. Может в Visual C++ 2010 это норма?
Асурус вне форума Ответить с цитированием
Старый 05.11.2012, 00:58   #5
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

а я ничего и не исправлял) спасибо плагину Source code formatter из CodeBlocks
Murashov вне форума Ответить с цитированием
Старый 05.11.2012, 10:51   #6
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Murashov Посмотреть сообщение
а я ничего и не исправлял) спасибо плагину Source code formatter из CodeBlocks
В VS делаю так: CTRL+A; CTRL+K, CTRL+F.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 05.11.2012, 10:57   #7
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

слишком долго :D
Murashov вне форума Ответить с цитированием
Старый 28.08.2018, 21:50   #8
Тимох
Пользователь
 
Регистрация: 13.04.2015
Сообщений: 32
По умолчанию

Доброго времени суток! При запуске примера SETPERS выпадает ошибка. Сам листинг компилируется, но при запуске отладки или при запуске самого исполняемого файла появляется ошибка.

#include <iostream>
#include <conio.h>
#include <iomanip>
#include <string>
#include <set>

using namespace std;

class Person {
private:
string lastName, firstName;
long phoneNumber;
protected:
public:
Person(void): lastName("пусто"), firstName("пусто"),
phoneNumber(0) { }
Person(string lana, string fina, long pho):
lastName(lana), firstName(fina), phoneNumber(pho)
{ }
void display(void) const;
friend bool operator<(const Person&, const Person&);
friend bool operator>(const Person&, const Person&);
friend bool operator==(const Person&, const Person&);
~Person(void) { }

};

bool operator<(const Person&, const Person&);
bool operator>(const Person&, const Person&);
bool operator==(const Person&, const Person&);

int main(int argc, char *argv[]) {
setlocale(LC_ALL, "RUS");

Person pers1("Deauville", "William", 8435150);
Person pers2("McDonald", "Stacey", 3327563);
Person pers3("Bartoski", "Peter", 6946473);
Person pers4("KuangThe", "Bruce", 4157300);
Person pers5("Wellington", "John", 9207404);
Person pers6("McDonald", "Amanda", 8435150);
Person pers7("Fridericks", "Roger", 7049982);
Person pers8("McDonald", "Stacey", 7764987);
multiset<Person, less<Person> > persSet;
multiset<Person>::iterator iter;
persSet.insert(pers1);
persSet.insert(pers2);
persSet.insert(pers3);
persSet.insert(pers4);
persSet.insert(pers5);
persSet.insert(pers6);
persSet.insert(pers7);
persSet.insert(pers8);

getch();
return 0;
}


void Person:: display(void) const {
cout<<setw(12)<<lastName;
cout<<setw(12)<<firstName;
cout<<"Телефон: "<<phoneNumber<<endl;
}

bool operator<(const Person &p1, const Person &p2) {
if(p1.lastName==p2.lastName)
{ return (p1.firstName<p2.firstName); }
else
{ return (p1.lastName<p2.firstName); }
}
bool operator>(const Person &p1, const Person &p2)
{ return ((!(p1<p2))&&(!(p1==p2))); }
bool operator==(const Person &p1, const Person &p2) {
return ((p1.lastName==p2.lastName)
&&(p1.firstName==p2.firstName));
}

Последний раз редактировалось Тимох; 28.08.2018 в 21:56.
Тимох вне форума Ответить с цитированием
Старый 29.08.2018, 01:32   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Тимох Посмотреть сообщение
появляется ошибка
Какая ошибка? У меня работает
Black Fregat вне форума Ответить с цитированием
Старый 29.08.2018, 07:02   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

А вот действительно ли в примере С++ в параметрах функции void? Или это ваша самодеятельность?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прочесть файл, если он используется другой программой AlexBobrov Общие вопросы Delphi 6 23.09.2016 23:13
Не получается зайти на сервер через Putty Rayled Администрирование dedicated серверов, VPS/VDS, shared хостингов, IaaS, PaaS. 2 08.04.2016 21:44
НЕ ПОЛУЧАЕТСЯ ЗАЙТИ НА VIMEO kathysoro17 Помощь студентам 1 01.04.2015 21:32
не получается выйти из цикла Taner Общие вопросы Delphi 9 22.04.2014 21:33
Может ли выйти из строя БП,если просто включен в сеть? Дима я Компьютерное железо 7 12.03.2011 22:54