Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как записать запись в файл? Есть вопрос. 
:(
    Опции темы
Vit
Дата 11.6.2002, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Вопрос такого плана - есть несколько типов в программе типа record,что то похожее на:

Type t1=record
             a:integer;
             b:boolean;
           end;

Type t2=record
             c:string[10];
             d:real;
           end;

Теперь вопрос можно ли переменные таких типов записать в файл при помощи одной и той же процедуры если заранее тип не известен(просто у меня таких типов очень много и писать для каждого из них отдельную процедуру не хочется). Через тип File не получается. Или файл надо объявлять точно соответствующего типа, либо если файл не типизирован то как передать контекст переменной?

var a:t2;

assignfile(f, MyFileName);
rewrite(f, sizeof(t2));
write(f, a); //здесь компиллятор генерит ошибку
write(f, a^); //так тоже не работает

Идеально было бы для меня работать через файловые потоки, там та же проблема:

MyFileStream.write(a,sizeof(a)); // компиллятор такое не пропускает


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
MBo
Дата 12.6.2002, 07:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











все же работает

Type t2=record
            c:string[10];
            d:double;
          end;
var
 at2:array[1..3] of t2;
 fs:tfilestream;
 i:integer;
begin
fs:=tfilestream.create('e:\qq.dat',fmCreate);
for i:=1 to 3 do begin
   at2[i].c:=inttostr(random(100));
   at2[i].d:=sqrt(i);
   fs.write(at2[i],sizeof(t2));
end;
fs.free;
end;
  Вверх
Vit
Дата 12.6.2002, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Спасибо


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 12.6.2002, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


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

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



MBo, рад приветствовать тебя здесь.

Sorry, за off.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 12.6.2002, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Цитата(Guest @ 11.6.2002, 23:36)
var
 at2:array[1..3]of t2;

А по другому как нельзя - все равно тип заранее надо определять, чего собственно я и хочу избежать... Как-то можно узнать указатель на область памяти занимаемую записью чтобы напрямую кусок памяти сбросить в файл?




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
MBo
Дата 14.6.2002, 04:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Немного не понял.
Как бы то ни было, при указании процедуре записать запись в файл нам непременно придется сказать ее имя. Раз знаем имя, известен и тип- ведь она где-то объявлена, и SizeOf сработает.
Другое дело, если имеется только безличный указатель на некую запись, но до этого лучше обычно не доводить.
Можно, конечно, спроектировать иерархию записей, в которой
TBaseRec=record
 Size:Integer;
 Field1:..
 Field2..
end;
TSomeRec=record
 Size:Integer;
 ...
end;
т.е. всегда есть поле размера, из которого берем количество записываемых байт, хоть так
 p:pointer;
 l:integer;

где-то раньше
 P:=@AnyConsistentRec;
...
 l:=PInteger(p)^;// size у нас всегда первый
 write(кудато, p, l);

Чувствуется аналогия со многими структурами WinAPI, в которых имеется поле
cbSize. Кроме того, так и хочется сделать 'эти штуки' наследниками TPersistent,
и пусть они сами все про себя знают и умеют писаться в поток.
  Вверх
Vit
Дата 14.6.2002, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Спасибо.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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