Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.21;
Скачать: CL | DM;

Вниз

Сохранение массива Record ов в файл   Найти похожие ветки 

 
Blacker77 ©   (2002-10-08 05:03) [0]

Hi Уважаемый Pipl!
Подскажите PLS как сделать Subj?

Есть тип:

TInfo = record
Disk :DWord;
Name : string;
FileSystemName : String;
Serial : String;
Size :Longint;
Text :String;
end;



Нужно из него образовать массив:


Info :array of TInfo;


А вот теперь надо его (массив) сохранить в файл.

Как это делается??????????? Я уже себе бошку сломал!
HEEEEEEEEEEEEEELP PLEEEEEEEEEEEEZZZZZZZZZ!

Заранее благодарен!


 
MBo ©   (2002-10-08 06:15) [1]

Используй, например, TFileStream
Пишешь: Количество записей
Запись: При желании общую длину записи (с учетом длин строк)
Cтатические поля (dword) писать тривиально
Длина строки
Ее содержимое
fstream.write(info[i].name[1],Length(info[i].name))

При чтении сначала SetLength для каждой строки


 
Blacker77 ©   (2002-10-08 20:48) [2]

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


 
Aleks1   (2002-10-09 03:28) [3]

2 Blacker77
Тогда скажи как читаешь и как ругается.


 
Bsl   (2002-10-09 09:03) [4]

А ты, наверное читаешь в "пустую" память.

Перед чтением нужно определить размер массива: SetLength(Массив, Кол-во элементов);

А вообще, string нельзя просто так сохранять - т.к. "string" - это указатель на область памяти. Можно использовать string[255] - это старые строки паскаля.
А если тебе надо хранить информацию типа MEMO - то это уже другая фишка - или ты думаешь, что в БД поля типа МЕМО просто так придумали, а размер текстовых полей ограничили 255 байтами!


 
MaratFromTomsk   (2002-10-09 09:24) [5]

Еще в стандартном паскале от Вирта
можно было определить файл

fr: File of TMyRecordType;

и читать и писать с помощью Get Put
неужели это не работает?!!!


 
Anatoly Podgoretsky ©   (2002-10-09 09:34) [6]

Это естественно работает, но смысла писать указатели нет, для начала надо перейти на короткие строки, только вот откуда ты взял такие странные функции для File of


 
Nomad.kz   (2002-10-09 09:42) [7]

еще я где-то читал (у Пачеки, имхо), что для таких целей надо организовывать packed record, в целях устранения выравнивания.


 
MaratFromTomsk   (2002-10-09 09:59) [8]

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

что то типа
TInfo = record
Disk: DWord;
Name: string[8];
FileSystemName: string[30];
Serial: string[20];
Size: Longint;
Text: string[255];
end;

// создать файл
procedure CreateFile(const filename: string);
begin
AssignFile(f, filename);
Rewrite(f);
end;

// считать запись
procedure ReadRecord(recno: integer; out r: TInfo);
begin
Seek(f, recno*SizeOf(TInfo));
Read(f, r);
end;

и т.д
но если размер записи не фиксирован,
то все уже зависит от задачи
мне например нравиться юзать классы TReader, TWriter
unit Classes,
или наирулезнейший XML в редакции MSXML,
можно какую нить СУБД



 
AndreyAG   (2002-10-09 10:11) [9]

объекты класса TStrings имеют метод LoadFromFile и SaveToFile
заносиш каждое поле своего recorда в строку из TStrings и используеш SaveToFile как восстановить думаю понятно


 
Tano   (2002-10-09 21:57) [10]

Простого решения нет. Такую Record напрямую не сохранишь.
Для таких целей я пишу цикл с НЕтипизированным файлом, только открывать его надо Reset(F,1), чтобы побайтово отсчитывался.
Готового кода предложить не могу, но алгоритм записи:
ДЛЯ записи[i] DO
begin
BlockWrite(F, переменная_1, длина);//...простые переменные
BlockWrite(F, переменная_N);
//если String - тоже верно записывает, если длина = SizeOf(String), но необходимо завести дополнительные переменные, в которых запишешь длину строки и поместить их перед самой строкой.
BlockWrite(F, переменная_длина_строки_String1
BlockWrite(F, String1, Length(String1));
end;
При чтении последовательность та же, только
BlockWrite меняешь на BlockRead и для каждой String читая длину очередной строки вызываешь SetLength(MyString1, прочитанная_длина), затем уже BlockRead(F, MyString, Length(String1))
Извеняюсь за расплывчатое объяснение, да и принцип можно придумать поумнее, наверное. Плюс его в том, что работает быстро при больших объемах информации и в том что он работает именно для произвольных конструкций Record.
P.S. я здесь на форуме натыкался на объяснение расположения в памяти переменной типа String. Если разобраться с деталями этого, то многое можно упростить.


 
Tano   (2002-10-09 22:00) [11]

remark:
//если String...... длина = Length(String)
и
BlockRead(F, String1, Length(String1))

ЗЫ торопился :)


 
Rouse_ ©   (2002-10-10 00:28) [12]

вместо String используй к примеру String[255], ну короче заранее установи размер переменной и никаких проблем с f: file of TInfo; не будет

Желаю успехов


 
Rouse_ ©   (2002-10-10 00:35) [13]

У блин, тоже поторопился, об этом уже написали ;)))



Страницы: 1 вся ветка

Текущий архив: 2002.10.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
1-68796
Swamp
2002-10-09 14:41
2002.10.21
Как сделать иконку 64X64 для EXE под D5


3-68635
QUE
2002-09-27 12:28
2002.10.21
Привет Мастера !!! Много форм в проекте как от этого избавиться .


14-69013
Эрик
2002-09-26 14:51
2002.10.21
У кого есть Delphi servise pack 2?


1-68808
atmospheric
2002-10-10 00:16
2002.10.21
Выключение windows 2000


4-69087
AlbertHakimov
2002-09-09 15:50
2002.10.21
Изменение ширины полосы прокрутки