Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись и чтение структуры из файла. [D7, 2003]


Semen_s ©   (2007-10-12 16:50:00) 

TRecord = record
 Id: LongWord;
 Data: array of string;
end;


Есть такая структура как мне записывать эту структуру в файл, что бы потом иметь возможноть дописать в произвольную запись данные?
Т.е.

{
Record0 =
Id = 1
Data[0] = la1
Data[1] = la2
Data[3] = la3
}

Record1
Id = 2
Data[0] = _la1
Data[1] = _la2
Data[3] = _la3
Data[4] = _la4
}

А потом мне нужно дописать данные Record0, увеличив Data[] или в любой другой RecordX.

Как это сделать, только учитвая что эти данные могут быть большими, поэтому мне не нужно считывать весь файл в память.

Точнее сформулировать наверное надо было вопрос... У меня на входе есть структура TRecord, потом по Id я проверяю у себя а программе следует ли создавать новую запись в файле - дописывая в конец "структуру", или мне нужно дописать данные Data в уже существующую "структуру" в файле.

Я даже предположить не могу, как это сделать. Что посоветуете?


clickmaker   (2007-10-12 17:14:00) [1]


> [7] oxffff_   (12.10.07 17:08)

а я намекаю на то, что после DataSize будет лежать массив данных, который мы туда ЯВНО запишем. Есессно, не простым присваиванием строк )

Если уж мы тут решили поконкурировать с производителями СУБД, то я бы делал так

TChunk = packed record
 Size: Cardinal;
 Data: Pointer;  // здесь - строка, записанная как массив байтов, в Size - ее длина
end;

TRecord = packed record
 Id: Cardinal;
 DataSize: Cardinal;
 ChunkCount: integer;
 Chunks: Pointer;
end;

т.е. по сути в файл пишется заголовок (то что до Pointer), а дальше лежат данные. А Pointer можно использовать для выделения памяти при чтении


oxffff_   (2007-10-12 17:08:00) [2]


> clickmaker ©   (12.10.07 17:03) [6]
>
> > [5] oxffff_   (12.10.07 16:59)
>
> в курсе
> и что?
> для этого DataSize и вводится. А после него пишется массив
> байт
> Хотя именно array of string и правда неудобно


Да если даже будет и так

TRecord = record
Id: LongWord;
DataSize: Cardinal;
Data: array[0..0] of string;
end;

то data все равно 4 байта.
Я намекаю на то, что это же указатель.


clickmaker   (2007-10-12 17:03:00) [3]


> [5] oxffff_   (12.10.07 16:59)

в курсе
и что?
для этого DataSize и вводится. А после него пишется массив байт
Хотя именно array of string и правда неудобно


oxffff_   (2007-10-12 16:59:00) [4]


> clickmaker ©   (12.10.07 16:56) [3]
> TRecord = packed record
> Id: LongWord;
> DataSize: Cardinal;    // сумма длин всех строк в Data
> Data: array of string;
> end;
>
> смотря на DataSize, можно вычислить смещение следующей структуры.
>


Data - это 4 байта.


oxffff_   (2007-10-12 16:59:00) [5]


> clickmaker ©   (12.10.07 16:56) [3]
> TRecord = packed record
> Id: LongWord;
> DataSize: Cardinal;    // сумма длин всех строк в Data
> Data: array of string;
> end;
>
> смотря на DataSize, можно вычислить смещение следующей структуры.
>


Data - это 4 байта.


Sergey13   (2007-10-12 16:56:00) [6]

> [0] Semen_s   (12.10.07 16:50)

Может тебе про базы данных поинтересоваться?


clickmaker   (2007-10-12 16:56:00) [7]

TRecord = packed record
Id: LongWord;
DataSize: Cardinal;    // сумма длин всех строк в Data
Data: array of string;
end;

смотря на DataSize, можно вычислить смещение следующей структуры.

PS. Не проще взять dbf? Или ClientDataSet - он умеет хранить данные локально, в файле


Сергей М.   (2007-10-12 16:55:00) [8]


> Что посоветуете?


Бросить это гнилое дело и почитать буквари по делфи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо