Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизЗапись и чтение структуры из файла. Найти похожие ветки
← →
Semen_s (2007-10-12 16:50) [0]
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 в уже существующую "структуру" в файле.
Я даже предположить не могу, как это сделать. Что посоветуете?
← →
Сергей М. © (2007-10-12 16:55) [1]
> Что посоветуете?
Бросить это гнилое дело и почитать буквари по делфи.
← →
Sergey13 © (2007-10-12 16:56) [2]> [0] Semen_s (12.10.07 16:50)
Может тебе про базы данных поинтересоваться?
← →
clickmaker © (2007-10-12 16:56) [3]TRecord = packed record
Id: LongWord;
DataSize: Cardinal; // сумма длин всех строк в Data
Data: array of string;
end;
смотря на DataSize, можно вычислить смещение следующей структуры.
PS. Не проще взять dbf? Или ClientDataSet - он умеет хранить данные локально, в файле
← →
oxffff_ (2007-10-12 16:59) [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) [5]
> clickmaker © (12.10.07 16:56) [3]
> TRecord = packed record
> Id: LongWord;
> DataSize: Cardinal; // сумма длин всех строк в Data
> Data: array of string;
> end;
>
> смотря на DataSize, можно вычислить смещение следующей структуры.
>
Data - это 4 байта.
← →
clickmaker © (2007-10-12 17:03) [6]
> [5] oxffff_ (12.10.07 16:59)
в курсе
и что?
для этого DataSize и вводится. А после него пишется массив байт
Хотя именно array of string и правда неудобно
← →
oxffff_ (2007-10-12 17:08) [7]
> 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:14) [8]
> [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 можно использовать для выделения памяти при чтении
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.064 c