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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись (чтение) структуры в (из) файл(а), как??? 
:(
    Опции темы
Syberex
Дата 23.8.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Трабла такая , есть такая вот структура:
 
Код

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



как мне записать массив таких структур в файл, а потом считать их целиком или произвольным доступом?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
MAKCim
Дата 23.8.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



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

Это сообщение отредактировал(а) MAKCim - 23.8.2007, 11:05


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Syberex
Дата 23.8.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



это понятно, но как именно записать, какой код нужен, укого есть примерчик записи чтения структур?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
MAKCim
Дата 23.8.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



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


Это сообщение отредактировал(а) MAKCim - 23.8.2007, 11:51


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Бывалый
*


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

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



хм, интерестный вариант, но эта функция структурно зависимая, а если структура поменяется то всё переделывать, а как записать и считать чтоб только в функцию структуру передать?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Lazin
Дата 23.8.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Можно добавить к структуре (классу) метод записывающий структуру в файл или поток, а так-же структуру читающую структуру из файла или(и) потока. Код который занимается загрузкой-сохранением не надо будет переделывать, даже если изменишь структуру.
PM MAIL Skype GTalk   Вверх
Алина
Дата 26.8.2007, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

#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");
...


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



****


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

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



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

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

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

Это сообщение отредактировал(а) zkv - 26.8.2007, 05:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1116 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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