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


Автор: Syberex 23.8.2007, 10:55
Трабла такая , есть такая вот структура:
 
Код

struct demon
    {
        string small;
        string big;
        long mem;
                  char[500];
                  int[50];
    };



как мне записать массив таких структур в файл, а потом считать их целиком или произвольным доступом?

Автор: MAKCim 23.8.2007, 10:59
Syberex, 
string - это std :: string?
если да
каждая запись в файле будет выглядеть следующим образом
[<size_small + size_big + sizeof(long) + 500 + sizeof(int) * 52>]<size_small> <small> <size_big> <big> <mem> <char[500]> <int[50]>
где число в [] показывает смещение следующей записи относительно адреса size_small

Автор: Syberex 23.8.2007, 11:33
это понятно, но как именно записать, какой код нужен, укого есть примерчик записи чтения структур?

Автор: MAKCim 23.8.2007, 11:49
Syberex, 
вот код
Код

void write(demon * ptr, int size, FILE * fs) {
    for (; size--; ++ptr) {
        int s_size = ptr -> small.length(),
             b_size = ptr -> big.length(),
             size = s_size + b_size + sizeof(long) + sizeof(int) * 52 + 500;
        fwrite(&size, sizeof(int), 1, fs);
        fwrite(&s_size, sizeof(int), 1, fs);
        fwrite(ptr -> small.c_str(), 1, s_size, fs);
        fwrite(&b_size, sizeof(int), 1, fs);
        fwrite(ptr -> big.c_str(), 1, b_size, fs);
        fwrite(ptr + 2 * sizeof(string), 1, sizeof(long) + sizeof(int) * 50 + 500, fs);
    }
}

Автор: Syberex 23.8.2007, 12:09
хм, интерестный вариант, но эта функция структурно зависимая, а если структура поменяется то всё переделывать, а как записать и считать чтоб только в функцию структуру передать?

Автор: Lazin 23.8.2007, 12:27
Можно добавить к структуре (классу) метод записывающий структуру в файл или поток, а так-же структуру читающую структуру из файла или(и) потока. Код который занимается загрузкой-сохранением не надо будет переделывать, даже если изменишь структуру.

Автор: Алина 26.8.2007, 05:39
Можно попробовать работать с бинарными файлами. В такие файлы можно записывать структуру целиком.
Код

#include <stdio.h>
struct demon
    {
      //Any structure you want...
    };
void main (void)
{
FILE* MyFile;
demon DemonArray[10];
MyFile=fopen("file.bin", "wb");
fwrite(&DemonArray, sizeof(demon), 10, MyFile);
fclose(MyFile);
}


#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

ptr - адрес, откуда будет начинаться коллекция блоков данных
size - размер одного блока
n - количество блоков
stream - поток, куда записываем
Всего будет записано n*size байтов, для работы с данными в таком режиме удобнее открыть файл как бинарный ("wb"):
Код

FILE* MyFile;
MyFile=fopen("file.bin", "wb");
...


Автор: zkv 26.8.2007, 05:45
Алина,  smile 
весело будет, если среди членов будут динамические данные (либо объекты содержащие таковые)

std::string как раз из этого разряда.

по-моему, в этих условиях, правильнее всего определить соответствующий метод для структуры (если с++, ну и классом ее обозвать, если не хотим запутать врага).

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