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

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

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 29-09-2005 09:31 » 

С помощью сериализации типа:

     CArchive ar(pLogFile, CArchive::load);
      while(...){
            pData=new CData;
          ar>>pData;
              m_Array.Add(pData);
                }

Как узнать когда файл закончился и считывать больше нечего? :?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #1 : 29-09-2005 09:32 » 

В названии темы имелось в виду несколько экземпляров одного класса
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 29-09-2005 09:43 » 

USBLexus,

самое простое - при сериализации сразу же запоминать количество экземпляров (тем более это происходит на твоей стороне, а не на вражеской Ага, ты же все равно сериализируешь объекты класса ), а потом их сохранять, тогда при чтении ты сначала считываешь это самое число,а потом по нему, как по счетчику, читаешь заданное количество объектов.

Иначе - не знаю.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Alf
Гость
« Ответ #3 : 29-09-2005 09:47 » 

А признак конца файла не годится?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 30-09-2005 02:13 » 

А признак конца файла не годится?
А что это за признак, как его использовать?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 30-09-2005 07:40 » 

USBLexus,

когда ты работаешь со стандартными функциями (например, испоьзуешь FILE - тип), там есть такая милая функция как feof - она и проверяет для тебя, дошел ли ты уже до конца или тебе еще что-то почитать надо.
Если делаешь Serialize и используешь CFile, посмотри функции
Seek(0, CFile::current) и GetLength - первая с такими параметрами должна, судя по описанию, вернуть количество прочитанных тобой ан данный момент байт, а вторая должна вернуть общее количество етих самых байт в файле. Посему если оба числа совпадают, то ты дошел до конза файла.
Но это надо попробовать на примерчике - насколько это так.

Или попробуй использовать стандартные функции чтения - записи open, read, close. Если надо, скину примерчики (из моего проекта - как ни странно, работает Ага ).
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 30-09-2005 07:58 » 

USBLexus,

когда ты работаешь со стандартными функциями (например, испоьзуешь FILE - тип), там есть такая милая функция как feof - она и проверяет для тебя, дошел ли ты уже до конца или тебе еще что-то почитать надо.
Если делаешь Serialize и используешь CFile, посмотри функции
Seek(0, CFile::current) и GetLength - первая с такими параметрами должна, судя по описанию, вернуть количество прочитанных тобой ан данный момент байт, а вторая должна вернуть общее количество етих самых байт в файле. Посему если оба числа совпадают, то ты дошел до конза файла.
Но это надо попробовать на примерчике - насколько это так.

Или попробуй использовать стандартные функции чтения - записи open, read, close. Если надо, скину примерчики (из моего проекта - как ни странно, работает Ага ).

Да в принципе так сейчас и собираюсь реализовывать через GetLength и GetPosition только неправильно как-то это На каждой итерации проверять GetPosition... Странно почему в конце файла архив просто не возвращает NULL, вместо этого он запускает особую ситуацию
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 30-09-2005 08:09 » 

А ты не пробовал эту сиутацию отлавливать?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 30-09-2005 08:44 » 

Да я честно говоря эти особые ситуации недолюбливаю У меня от них мурашки по коже хотя засунуть цикл чтения в try тоже вариант...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 30-09-2005 09:36 » 

На самом деле "не так страшен чёрт, как его малютка". Приём довольно-таки стандартный, особенно при итерации. Согласно МСДН операторы << и >> выкидываю 3 исключения:
throw(
   CArchiveException*,
   CFileException*,
   CMemoryException*
);

Попробуй отловить их всех, ну и ещё остаток catch(...)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Alf
Гость
« Ответ #10 : 30-09-2005 09:41 » 

Да я честно говоря эти особые ситуации недолюбливаю У меня от них мурашки по коже хотя засунуть цикл чтения в try тоже вариант...

А как же тогда твои программы обрабатывают ошибки? Неужели любой сбой вываливает программу целиком?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 30-09-2005 10:01 » 

мурашки - это неправильно Улыбаюсь

а кроме того в некоторых ексепшенах можно найти описание на человечьем языке - что именно случилось Улыбаюсь
Записан

Alf
Гость
« Ответ #12 : 30-09-2005 10:15 » 

а кроме того в некоторых ексепшенах можно найти описание на человечьем языке - что именно случилось Улыбаюсь

Практически во всех. А если их самостоятельно писать, так и тем более можно весьма обстоятельную диагностику делать.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #13 : 03-10-2005 02:00 » new

Да я честно говоря эти особые ситуации недолюбливаю У меня от них мурашки по коже хотя засунуть цикл чтения в try тоже вариант...

А как же тогда твои программы обрабатывают ошибки? Неужели любой сбой вываливает программу целиком?
Незнаю может это и не совсем правильно но мне пока хватало if ов для диагностики состояния программы или класса Try Catch я использую очень редко - например при подключении к БД через ODBC или в работе с оборудованием когда if ами проверка невозможна
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines