Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class employee, fstream 
:(
    Опции темы
observateur
Дата 15.11.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Код

// mine.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
#include <conio.h>

class employee
{
private: char name[20];
         int number;
         static int n;
         static employee* ptr[];
         
         
         

public: virtual void getdata()
        {
            cout<<"ENTER NAME: ";    cin>>name;
            cout<<"ENTER NUMBER: "; cin>>number;
        }

        virtual void show()
        {
            cout<<"NAME YOU ENTERED: "<<name<<endl;
            cout<<"NUMBER YOU ENTERED: "<<number<<endl;
        }
        static void add();
         static void display();
         static void write();
         static void read();
};
/////////////////////
employee* employee::ptr[20];
int employee::n=0;
class manager:public employee
{
private: char title[10];
         int money;

public: void getdata()
        {
            employee::getdata();
            cout<<"ENTER TITLE: ";    cin>>title;
            cout<<"ENTER MONEY: ";    cin>>money;
            
        }

        void show()
        {
            employee::show();
            cout<<"TITLE YOU ENTERED: "<<title<<endl;
            cout<<"MONEY YOU ENTERED: "<<money<<endl;
        }
};
//////////////////////////////////
class scientist:public employee
{
private: int pub;

public: void getdata()
        {
            employee::getdata();;
            cout<<"ENTER YOUR PUBLISHING: ";    cin>>pub;
        }

        void show()
        {
            employee::show();
            cout<<"PUBLISHING YOU ENTERED: "<<pub<<endl;
        }
};
////////////////////
class laborer: public employee
{
};
void employee::add()
{
    char ch;
    cout<<"m- manager\n"<<"s- scientist\n"<<"l- laborer\n";
    cout<<"ENTER char: ";    cin>>ch;
    switch(ch)
    {
    case'm': ptr[n]=new manager; break;
    case's': ptr[n]=new scientist; break;
    case'l': ptr[n]=new laborer; break;
    }

    ptr[n++]->getdata();
}
////////////////////////
void employee::display()
{
    
    for(int j=0;j<n;j++)
    {
        cout<<"*/*/*/*/*/*/*"<<endl;
        ptr[j]->show();
        cout<<"*/*/*/*/*/*/*"<<endl;
    }
}
/////////////////////
void employee::write()
{
    ofstream outf("file.dat",ios::app | ios::binary);
    for(int j=0;j<n; j++)
    {
        outf.write(reinterpret_cast<char*>(ptr[j]),sizeof(employee));
    }
}
////////////////////////////
void employee::read()
{
    int j=0;
    ifstream inf("file.dat",ios::binary);
    inf.seekg(0);
    
    
    while(!inf.eof())
    {
    inf.read((char*)ptr[j],sizeof(employee));
    j++;
    }



}
int main(int argc, char* argv[])
{
    char ch;
    while(true)
    {
        cout<<"\na- add new member\n"<<"d- display members\n"<<"w- write to file\n"
            <<"r- read from the file\n"<<"x- exit\n";
        cout<<"ENTER char: "; cin>>ch;
        switch(ch)
        {
        case'a': employee::add(); break;
        case'd': employee::display();break;
        case'w': employee::write(); break;
        case'r': employee::read();break;
        case'x': exit(0);
        }
    }
    
    return 0;
}





вопрос такой.... а вообшето просба ....почему у меня выходит ошибка?
PM MAIL   Вверх
Sartorius
Дата 15.11.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 Где?Какая?
PM MAIL ICQ   Вверх
Rockie
Дата 15.11.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



observateur, 
Код
    while(true)
 это бесконечный цикл. Это не ошибка а warning, в BCB 6 по крайней мере (нужно закомментировать #include "stdafx.h")

Это сообщение отредактировал(а) Rockie - 15.11.2006, 22:16


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
observateur
Дата 16.11.2006, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Цитата(Rockie @  15.11.2006,  22:14 Найти цитируемый пост)
(нужно закомментировать #include "stdafx.h")

не понял

Добавлено @ 05:39 
по моему у меня проблема по ввода- вывода (в файлах)....
PM MAIL   Вверх
JackYF
Дата 16.11.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



observateur, выражайся поконкретнее - какая ошибка. Мы ж не телепаты.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Oleg_Ci
Дата 16.11.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Код

#include "stdafx.h"
#include <iostream>
using namespace std; // <<<
#include <fstream>
#include <conio.h>

// надо так :
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std; // <<<

PM MAIL   Вверх
EvgenZ
Дата 16.11.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Олег4,  а какая разница?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
JackYF
Дата 16.11.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(EvgenZ @  16.11.2006,  15:37 Найти цитируемый пост)
Олег4,  а какая разница? 


Как минимум, не очень красиво...

А вообще лучше using namespace std убрать..., если не лабораторка smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
EvgenZ
Дата 16.11.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Я в смысле работоспособности... помоему это вообще никак не влияет и вот решил просветиться... подумал может я чего не так понимаю... 
Насколько я знаю эта деректива начинает действовать с той строки где она объявлена, а в приведенном примере она ни на что влиять не должна.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
observateur
Дата 16.11.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Цитата(JackYF @  16.11.2006,  14:04 Найти цитируемый пост)
observateur, выражайся поконкретнее - какая ошибка. Мы ж не телепаты. 

По моему как только запустит программу можно увидеть ошибку. Верно  что компилятор не может определят ошибку но как только  вы будете использовать программу вы увидети в чем дело….
Добавит работника  я умею а вот когда читаю объект из файла  выходит ошибка….

PM MAIL   Вверх
Earnest
Дата 16.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



observateur, хочешь, чтобы тебе помогли - покажи, где и какая ошибка "выходит". 


--------------------
...
PM   Вверх
JackYF
Дата 16.11.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



У меня все работает: добавил, записал, считал, посмотрел - все то.

Ты его туда перед считыванием записал?

Это сообщение отредактировал(а) JackYF - 16.11.2006, 18:52


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
observateur
Дата 16.11.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



1.    запускаю программу
2.    нажимаю «а»
3.    потом “м”
4.    добавляю туда работника
5.    “w” // добавит в файл
6.    “r” // читать из файла
7.    “d” // выводить на экран 
8.    еще раз “a”
9.    “s”
10.    добавляю туда работника
11.    “w” // добавит в файл
12.     “r” // читать из файла
13.     и вот ошибка  

PM MAIL   Вверх
JackYF
Дата 16.11.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(observateur @  16.11.2006,  19:28 Найти цитируемый пост)
8.    еще раз “a”
9.    “s”
10.    добавляю туда работника
11.    “w” // добавит в файл
12.     “r” // читать из файла
13.     и вот ошибка  


Ага, ну так с этого надо было начинать! Сейчас посмотрим....

Добавлено @ 20:55 
Для начала сделай деструктор виртуальным... Перегрузка все-таки, и виртуальные функции.

Добавлено @ 21:00 
А потом, я никак не могу понять, зачем ты в классе employee объявлил массив employee? Почему не объявить его в main()?

Если хочешь контейнер - сделай класс employee, а потом employeeHolder. Зачем все в одну кучу? Сложновато с таким кодом работать, если честно... ИМХО.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Frosty23
Дата 16.11.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.11.2006

Репутация: нет
Всего: нет



Неправильно организовано чтение, в нем по факту у тя предполагаеться, что память под объекты, которые ты читаешь, уже выделена.

Код

void employee::read()
{
    int j=0;
    ifstream inf("file.dat",ios::binary);
    inf.seekg(0);


    while(!inf.eof())
    {
        // Смотрим кто следующий(для этого нужно перед запистью хранить инфу о ее типе)
        // Перед чтением выделяем память, удаляя предыдущий указатель(если нужно)
        if(ptr[j] == NULL) delete ptr[i];
        ptr[j] = NULL;
        
        case()
        {
            ...: 
                 ptr[j] = new ...;
                 inf.read((char*)ptr[j],sizeof(...));
                 break;
            ...
        } 
 
        j++;
    }// Поехали! дальше
    j++;
    }
}


Это сообщение отредактировал(а) Frosty23 - 16.11.2006, 21:40
PM MAIL   Вверх
observateur
Дата 16.11.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Дело в том что я сейчас только изучаю файловый ввод/вывод, у меня один пример и тщательно  изучаю его. Пример такой….
Код

// empl_io.cpp
// performs file I/O on employee objects
// handles different sized objects
#include <fstream>            //for file-stream functions
#include <iostream>
#include <typeinfo>           //for typeid()
using namespace std;
#include <process.h>          //for exit()

const int LEN = 32;           //maximum length of last names
const int MAXEM = 100;        //maximum number of employees

enum employee_type {tmanager, tscientist, tlaborer};
////////////////////////////////////////////////////////////////
class employee                //employee class
   {
   private:
      char name[LEN];         //employee name
      unsigned long number;   //employee number
      static int n;           //current number of employees
      static employee* arrap[];  //array of ptrs to emps
   public:
      virtual void getdata()
         {
         cin.ignore(10, '\n');
         cout << "   Enter last name: "; cin >> name;
         cout << "   Enter number: ";      cin >> number;
         }
      virtual void putdata()
         {
         cout << "\n   Name: " << name;
         cout << "\n   Number: " << number;
         }
      virtual employee_type get_type();  //get type
      static void add();      //add an employee
      static void display();  //display all employees
      static void read();     //read from disk file
      static void write();    //write to disk file
   };
//--------------------------------------------------------------
//static variables
int employee::n;              //current number of employees
employee* employee::arrap[MAXEM];  //array of ptrs to emps
////////////////////////////////////////////////////////////////
//manager class
class manager : public employee
   {
   private:
      char title[LEN];        //"vice-president" etc.
      double dues;            //golf club dues
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter title: ";          cin >> title;
         cout << "   Enter golf club dues: "; cin >> dues;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Title: " << title;
         cout << "\n   Golf club dues: " << dues;
         }
   };
////////////////////////////////////////////////////////////////
//scientist class
class scientist : public employee
   {
   private:
      int pubs;               //number of publications
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter number of pubs: "; cin >> pubs;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Number of publications: " << pubs;
         }
   };
////////////////////////////////////////////////////////////////   
//laborer class
class laborer : public employee
   {
   };
////////////////////////////////////////////////////////////////
//add employee to list in memory
void employee::add()
   {
   char ch;
   cout << "'m' to add a manager"
           "\n's' to add a scientist"
           "\n'l' to add a laborer"
           "\nEnter selection: ";
   cin >> ch;
   switch(ch)
      {                       //create specified employee type
      case 'm': arrap[n] = new manager;   break;
      case 's': arrap[n] = new scientist; break;
      case 'l': arrap[n] = new laborer;   break;
      default: cout << "\nUnknown employee type\n"; return;
      }
   arrap[n++]->getdata();     //get employee data from user
   }
//--------------------------------------------------------------
//display all employees
void employee::display()
   {
   for(int j=0; j<n; j++)
      {
      cout  << (j+1);           //display number
      switch( arrap[j]->get_type() )   //display type
         {
         case tmanager:    cout << ". Type: Manager";   break;
         case tscientist:  cout << ". Type: Scientist"; break;
         case tlaborer:    cout << ". Type: Laborer";   break;
         default: cout << ". Unknown type";
         }
      arrap[j]->putdata();    //display employee data
      cout << endl;
      }
   }
//--------------------------------------------------------------
//return the type of this object
employee_type employee::get_type()
   {
   if( typeid(*this) == typeid(manager) )
      return tmanager;
   else if( typeid(*this)==typeid(scientist) )
      return tscientist;
   else if( typeid(*this)==typeid(laborer) )
      return tlaborer;
   else
      { cerr << "\nBad employee type"; exit(1); }
   return tmanager;
   }
//--------------------------------------------------------------
//write all current memory objects to file
void employee::write()
   {
   int size;
   cout << "Writing " << n << " employees.\n";
   ofstream ouf;              //open ofstream in binary
   employee_type etype;       //type of each employee object

   ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
   if(!ouf)
      { cout << "\nCan't open file\n"; return; }
   for(int j=0; j<n; j++)     //for every employee object
      {                       //get its type
      etype = arrap[j]->get_type();
                              //write type to file
      ouf.write( (char*)&etype, sizeof(etype) );
      switch(etype)           //find its size
         {
         case tmanager:   size=sizeof(manager); break;
         case tscientist: size=sizeof(scientist); break;
         case tlaborer:   size=sizeof(laborer); break;
         }                    //write employee object to file
      ouf.write( (char*)(arrap[j]), size );
      if(!ouf)
         { cout << "\nCan't write to file\n"; return; }
      }
   }
//--------------------------------------------------------------
//read data for all employees from file into memory
void employee::read()
   {
   int size;                  //size of employee object
   employee_type etype;       //type of employee
   ifstream inf;              //open ifstream in binary
   inf.open("EMPLOY.DAT", ios::binary);
   if(!inf)
      { cout << "\nCan't open file\n"; return; }
   n = 0;                     //no employees in memory yet
   while(true)
      {                       //read type of next employee
      inf.read( (char*)&etype, sizeof(etype) );
      if( inf.eof() )         //quit loop on eof
         break;
      if(!inf)                //error reading type
         { cout << "\nCan't read type from file\n"; return; }
      switch(etype)
         {                    //make new employee
         case tmanager:       //of correct type
            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;
         }                    //read data from file into it
      inf.read( (char*)arrap[n], size  );
      if(!inf)                //error but not eof
         { cout << "\nCan't read data from file\n"; return; }
      n++;                    //count employee
      }  //end while
   cout << "Reading " << n << " employees\n";
   }
////////////////////////////////////////////////////////////////
int main()
   {
   char ch;
   while(true)
      {
      cout << "'a' -- add data for an employee"
              "\n'd' -- display data for all employees"
              "\n'w' -- write all employee data to file"
              "\n'r' -- read all employee data from file"
              "\n'x' -- exit"
              "\nEnter selection: ";
      cin >> ch;
      switch(ch)
         {
         case 'a':            //add an employee to list
            employee::add(); break;
         case 'd':            //display all employees
            employee::display(); break;
         case 'w':            //write employees to file
            employee::write(); break;
         case 'r':            //read all employees from file
            employee::read(); break;
         case 'x': exit(0);   //exit program
         default: cout << "\nUnknown command";
         }  //end switch
      }  //end while
   return 0;
   }  //end main()


 потом там написано :” Мы умеем определять класс объекта, находящегося в памяти, но как узнать класс объекта, если мы собираемся читать его из файла? Поэтому при записи данных на диск необходимо записывать код (перечисляемую переменную типа employee_type) прямо перед данными объекта. До начала чтения из файла надо прочитать его значение и создать объект соответствующего типа. И только после этого можно копировать данные из файла в этот новый объект. ”

мне интересно узнать если определит  sizeof(employee) все байты равны, если равны значит все байты совпадают. Тогда почему нам определит класс объекта……..


PM MAIL   Вверх
JackYF
Дата 16.11.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



А ты ставь специальную меточку, типа там 0,1,2 - определенные константы по одной для каждого типа перед, собственно, телом...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
observateur
Дата 16.11.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 10.6.2006

Репутация: нет
Всего: нет



Цитата(JackYF @  16.11.2006,  22:02 Найти цитируемый пост)
А ты ставь специальную меточку, типа там 0,1,2 - определенные константы по одной для каждого типа перед, собственно, телом... 

 я с тобою согласен и я не хочу сказать что прог которая была в книге не верно...нет....
я просто хочу понять
Цитата(observateur @  16.11.2006,  21:47 Найти цитируемый пост)
мне интересно узнать если определит  sizeof(employee) все байты равны, если равны значит все байты совпадают. Тогда почему нам определит класс объекта……..


а помоему FROSTY23 говорит правду....ну это я завтра проверю....спать хочется....и спасибо всем ....посторалис ответит мне....je regrete pour ma Russe...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.