Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > чтение/запись сложных структур данных из/в файл


Автор: just_geek 30.3.2009, 17:39
Есть к примеру структура:

Код

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) );
}


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

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

Автор: GoldFinch 30.3.2009, 17:50
#define READ(x) read((char*)&x, sizeof(x) );

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


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

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

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





Автор: Dem_max 30.3.2009, 18:58
считывай всю структуру
Код

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

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

dta.a2==1

Автор: just_geek 30.3.2009, 19:18
Цитата

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

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

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

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

Код

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


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

Цитата(Anikmar)

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


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

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

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

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

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

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


Тогда первый минимальный блок уже найден - строка.
Что-то вроде небольшого класса, в котором реализован метод ReadFromFile. И так далее.

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

Автор: just_geek 31.3.2009, 09:43
Да вот думаю, что все таки надо smile Попробую через Qt'шный QDataStream. Т.к. не охото еще в зависимостях boost тащить

Автор: korbian 31.3.2009, 09:49
еще не известно, что большее зло!!! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)