![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись и чтение структуры из файла. [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]
> Что посоветуете?
Бросить это гнилое дело и почитать буквари по делфи.