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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись класса в файл (Borland C++ 3.1), запись происходит, но... 
:(
    Опции темы
DjoNIK
Дата 4.6.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток!
Я так понял, что классы fstream, ifstream и ofstream есть в этом компиляторе, но как с ними работать я не знаю, 
поэтому выбрал класический C-шный вариант работы с онными. Но мой код при PutDB() заносит какую-то совершенно 
"левую" информацию в файл, и, возможно по этой причине (или по другой), GetDB() выдаёт также что-то 
невообразимое.
Помогите понять в чём проблема!
Код

class player
{
private:
public:
    const int ID;
    static int count;
    char nik[35];
    float balance;
    long int seek_pos;
    float stake;
    int cock_num;
public:
    player() : ID(++count), balance(0.00f)
    {
     strcpy( nik, "unnamed" );
    }
    player( const char* name, float b, long int s_p ) :
      ID(++count), balance(b), seek_pos(s_p)
    {
     strcpy( nik, name );
    }
    void GetData() const
    {
      cout << "\n €¬п ЁЈа®Є : " << nik;            // Имя игрока
      cout << "\n Ѓ « ­б ЁЈа®Є : " << balance;        // Баланс игрока
    }
    void PutData()
    {
      cout << "\n ‚ўҐ¤ЁвҐ Ё¬п ЁЈа®Є : ";            // Введите имя игрока
      cin >> nik;
      cout << "\n ‚ўҐ¤ЁвҐ ЇҐаў®­ з «м­л© Ў « ­б ЁЈа®Є : ";    // Введите первоначальный баланс
      cin >> balance;
    }
    void Stake()
    {
       cout << "\n ђ §¬Ґа бв ўЄЁ: ";            // Размер ставки
       cin >> stake;
       cout << "\n Ќ  Є Є®Ј® в а Є ­  Ўг¤Ґ¬ бв ўЁвм?";    // Номер таракана
       cin >> cock_num;
    }
    void ResOfStake( int c_n )
    {
       if( cock_num==c_n )
        {
         balance += stake;
        }
       else
        {
         balance -= stake;
        }
    }
};


class DB
{
private:
    player* pl[100];
    char nik[35];
    float balance;
    FILE* f;
    char str[77];
public:
    void PutDB()
     {
      int i=0;
      char *strf, *strd;
      char choice;
      int dec, sign, ndig = 10;
      f = fopen("file.dat", "ab");
      if(!f)
       {
        cout << "\n Џа®Ў«Ґ¬л б ®вЄалвЁҐ¬ д ©« !";        // Проблемы с открытием файла
        getch();
        exit(1);
       }
      do
      {
       pl[i]=new player;
       pl[i]->PutData();
       fwrite( pl[i], sizeof(player), 1, f);
       i++;
       cout << "\n …йс ®¤Ё­ ЁЈа®Є?(y/n)";            // Ещё один игрок?(y/n)
       cin >> choice;
      }
      while(choice!='n');
      fclose( f );
     }

    void GetDB()
     {
      int i=0;
      char *strf, *strd;
      int dec, sign, ndig = 10;
      f = fopen("file.dat", "ab");
      if(!f)
       {
        cout << "\n Џа®Ў«Ґ¬л б ®вЄалвЁҐ¬ д ©« !";        // Проблемы с открытием файла
        getch();
        exit(1);
       }
      while( !feof(f) );
      {
       pl[i]=new player;
       fread( pl[i], sizeof(player), 1, f);
       pl[i]->GetData();
       i++;
      }
      fclose( f );
     }
 }



--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
nerezus
  Дата 5.6.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Ты хоть знаешь, что fwrite делает?
У тебя же вместо буффера объект!!

P.S. и что, даже компилер ошибки не выдает?
P.P.S. Про сериализацию слышал?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
EnergoHokum
Дата 5.6.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По моему, сериализация объектов классов - очччень небезопасное занятие. Что случится, если сериализован объект с открытыми дескрипторами (файлов или чего ещё), а при восстановлении объекты, на которые указывали дескрипторы, удалены? Явно ничего хорошего. Ну, в качестве Експеримента можно поиграть, но в реальный проект я бы побоялся такое вводить.
PM MAIL ICQ   Вверх
nerezus
  Дата 5.6.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



EnergoHokum, ну дык нужно при сериализации объекта сериализовывать объекты в нем, например агрегированный объект ФС.

Добавлено через 1 минуту и 27 секунд
Да или прросто при сериализации закрываем хендл файла и сохраняем имя. При обратном процессе - открываем файл на прежней позиции.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
math64
Дата 5.6.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

 f = fopen("file.dat", "ab"); // Открытие на дописывание
 f = fopen("file.dat", "wb"); // Открытие на перезапись
 f = fopen("file.dat", "rb"); // Открытие на чтение

class player не имеет виртуальных методов, поэтому можно применить fwrite()/fread(), но лучше
Код

struct PlayerData {
  ...
};
class Player : private PlayerData {
  ...
public:
    void Save(FILE* f) {
       fwrite((PlayerData*)this, sizeof(PlayerData), 1, f);
    }
    void Load(FILE* f) {
       fread((PlayerData*)this, sizeof(PlayerData), 1, f);
    }
}

Кроме того лучше не смешивать ввод/вывод по stdio и iostream в пределах одного файла (в вашем случае - консоль)

PM   Вверх
EnergoHokum
Дата 5.6.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всё равно, сериализация объектов компилируемого языка - неуютно как-то (может, я и зря паникую)
PM MAIL ICQ   Вверх
DjoNIK
Дата 5.6.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

У тебя же вместо буффера объект!!


Код

player* pl[100];
...
fwrite( pl[i], sizeof(player), 1, f);

Разве указатель не сойдёт за буфер???

Цитата

P.S. и что, даже компилер ошибки не выдает?

Нет, по моему и не должен!

Цитата

P.P.S. Про сериализацию слышал?

Нет.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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