Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Массив в файл

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Ninelka
Гость





СообщениеДобавлено: Чт Янв 16 2003 17:19    Заголовок сообщения: Массив в файл Ответить с цитатой

У меня есть массив структур типа
struct My
{int a,b,c;
TColor TClr;
String Text;
};
My Massiv[30];
Как всё это быстро сохранить в файл а затем также легко достать обратно?
Вернуться к началу
Борис
Гость





СообщениеДобавлено: Чт Янв 16 2003 18:38    Заголовок сообщения: fwrite((void*)Massiv, sizeof(My),30,файл); fread((void*)Massiv, sizeof(My),30,файл);(+) Ответить с цитатой

так можно сделать чтение-запись самого массива, но пробежавшись по массиву, можно аналогично прочитать-записать и данные, на которые показывают указатели из самого массива.
Вернуться к началу
Ninelka
Гость





СообщениеДобавлено: Пт Янв 17 2003 16:07    Заголовок сообщения: Re: fwrite((void*)Massiv, sizeof(My),30,файл); fread((void*)Massiv, sizeof(My),30,файл);(+) Ответить с цитатой

Вот с этого места можно поподробнее %)) Как куда пробежаться??
Вернуться к началу
Ninelka
Гость





СообщениеДобавлено: Пт Янв 17 2003 16:10    Заголовок сообщения: Re: fwrite((void*)Massiv, sizeof(My),30,файл); fread((void*)Massiv, sizeof(My),30,файл);(+) Ответить с цитатой

Вот с этого места можно поподробнее %)) Как куда пробежаться??
Вернуться к началу
Борис
Гость





СообщениеДобавлено: Пт Янв 17 2003 17:38    Заголовок сообщения: Details for miss Ответить с цитатой

Abstract

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

Если же таких, связанных через указатели, данных нет, то достаточно записать только сам массив.

Chapter 1

Запись

Запись простого массива Вы уже видели. Запись данных делается (например) так.

Пусть поле-указатель имеет имя "ukaz" и тип "tip_uk*", и участок памяти, на который он указывает содержит "kol_el" нужных данных.
Файловый идентификатор пусть называется "fail"

Если kol_el не нужно сохранять в файле, то пример такой.

for(i=0;i < 30;i++){
fwrite((void*)Massiv[i].ukaz, sizeof(tip_uk),kol_el,fail);
}


Если kol_el нужно сохранять в файле, то пример такой (kol_el в этом случае должен быть переменной).

for(i=0;i < 30;i++){
fwrite((void*) &kol_el, sizeof(kol_el),1,fail);
fwrite((void*)Massiv[i].ukaz, sizeof(tip_uk),kol_el,fail);
}


Chapter 2

Чтение

Чтение простого массива Вы уже видели. Чтение данных делается (например) так.

Примем те же соглашения по именам.

Если kol_el заранее известен (и не сохранен в файле), то примеры такие.

Если kol_el==1
for(i=0;i < 30;i++){

Massiv[i].ukaz=(tip_uk*)malloc(sizeof(tip_uk));
или
Massiv[i].ukaz=new tip_uk;

fread((void*)Massiv[i].ukaz, sizeof(tip_uk),kol_el,fail);
}


Если kol_el > 1
for(i=0;i < 30;i++){

Massiv[i].ukaz=(tip_uk*)calloc(sizeof(tip_uk),ko l_el);
или
Massiv[i].ukaz=new tip_uk [kol_el];

fread((void*)Massiv[i].ukaz, sizeof(tip_uk),kol_el,fail);
}


Если kol_el заранее не известен (тогда он сохранен в файле), то пример такой (kol_el в этом случае как и при записи должен быть переменной).

for(i=0;i < 30;i++){
fread((void*) &kol_el, sizeof(kol_el),1,fail);

Massiv[i].ukaz=(tip_uk*)calloc(si zeof(tip_uk),kol_el);
или
Massiv[i].ukaz=new tip_uk [kol_el];

fwrite((void*)Massiv[i].ukaz, sizeof(tip_uk),kol_el,fail);
}

Конец
Естественно, нужны еще всякие проверки результатов записи-чтения-выделения памяти, и нужно учитывать, что в структуре может быть больше одного указателя
.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...