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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение/запись сложных структур данных из/в файл 
:(
    Опции темы
just_geek
Дата 30.3.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть к примеру структура:

Код

struct Data
{
  char a1;
  char a2;
  char a3;
};


Код

// считываем данные
read((char*)&a1, sizeof(a1) );
read((char*)&a2, sizeof(a2) );
if ( a2 == 1 )
{
    read((char*)&a3, sizeof(a3) );
}


И куча подобных структур... И куча подобных проверок. 

Вообщем охота как-то сделать покрасивее, а не тупо набивать однообразный и скучный код. Есть какие-то методы?

PM MAIL   Вверх
GoldFinch
Дата 30.3.2009, 17:50 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



#define READ(x) read((char*)&x, sizeof(x) );
PM MAIL ICQ   Вверх
Anikmar
Дата 30.3.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(just_geek @  30.3.2009,  17:39 Найти цитируемый пост)
Вообщем охота как-то сделать покрасивее, а не тупо набивать однообразный и скучный код. Есть какие-то методы?


Провести некое подобие нормализации - разбить структуры на однотипные небольшие блоки и в них реализовыватьсчитывание и  проверки. А вообще лучше поделитесь задачей - может выход попроще найдем, чем посимвольно считывать и проверять.
PM MAIL ICQ   Вверх
mes
Дата 30.3.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(just_geek @  30.3.2009,  16:39 Найти цитируемый пост)
И куча подобных структур... И куча подобных проверок. 
Вообщем охота как-то сделать покрасивее, а не тупо набивать однообразный и скучный код. Есть какие-то методы?

ну и с того что Вы написали невозможно представить полную картину и в частности семантику считывания структур.
Опишите что представляют из себя структуры, зачем необходима такая проверка в Вашем случае и какой язык используете Си или С++.







--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 30.3.2009, 18:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



считывай всю структуру
Код

Data dta;
read(&dta, sizeof(dta));

а потом уже проверяй 
Код

dta.a2==1



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
just_geek
Дата 30.3.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

ну и с того что Вы написали невозможно представить полную картину и в частности семантику считывания структур.
Опишите что представляют из себя структуры, зачем необходима такая проверка в Вашем случае и какой язык используете Си или С++.

Гм. Вообщем это карта от отдной известной игры smile
Проверки нужны, за тем что если a2 == 0, то байт a3 в файле отсутствует. Язык С++, а если еще точнее, то используется Qt.

Ну к примеру возьмем базовую вещь. Строку

Представлена таким видом.

Код

struct String
{
    uint32 length; // если == 0, то соответственно данных нету.
    char *data;
};


А строка может входить в другие блоки данных.

Цитата(Anikmar)

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


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

Это сообщение отредактировал(а) just_geek - 30.3.2009, 19:19
PM MAIL   Вверх
Ivanovich
Дата 31.3.2009, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Каждую структуру (класс) надо научить себя самостоятельно считывать из потока данных и записывать в поток данных.

Это сообщение отредактировал(а) Ivanovich - 31.3.2009, 05:46
PM MAIL   Вверх
Anikmar
Дата 31.3.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(just_geek @  30.3.2009,  19:18 Найти цитируемый пост)
Ну к примеру возьмем базовую вещь. Строку

Представлена таким видом.

struct String
{
    uint32 length; // если == 0, то соответственно данных нету.
    char *data;
};

А строка может входить в другие блоки данных.


Тогда первый минимальный блок уже найден - строка.
Что-то вроде небольшого класса, в котором реализован метод ReadFromFile. И так далее.
PM MAIL ICQ   Вверх
korbian
Дата 31.3.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а почему никто сериализацию не предлагает, boost::serialization, например??? Помоему покрасивее будет.


--------------------
korbian ©
PM   Вверх
just_geek
Дата 31.3.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да вот думаю, что все таки надо smile Попробую через Qt'шный QDataStream. Т.к. не охото еще в зависимостях boost тащить
PM MAIL   Вверх
korbian
Дата 31.3.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



еще не известно, что большее зло!!! smile


--------------------
korbian ©
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0878 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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