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

Вниз

Запись и чтение структуры из файла.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
15-1191741805
Инглиш
2007-10-07 11:23
2007.11.04
Экскурсия


2-1192121694
alikon1
2007-10-11 20:54
2007.11.04
SQL запрос требует ненужные поля


15-1191529424
cber
2007-10-05 00:23
2007.11.04
Задача по тер-веру


2-1192041920
NiGGa
2007-10-10 22:45
2007.11.04
Delphi7 и поиск ошибок


15-1191691351
cber
2007-10-06 21:22
2007.11.04
библиотека