Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.047 c
2-1192086758
Quart
2007-10-11 11:12
2007.11.04
Подключение к БД


15-1191225779
Gramazila
2007-10-01 12:02
2007.11.04
TJPEGImage глючит


2-1192078111
zzzz
2007-10-11 08:48
2007.11.04
Переместить в конец курсор


2-1192280257
AlexanderMS
2007-10-13 16:57
2007.11.04
Проблема с курсором на Edit е.


15-1191397694
Реактор
2007-10-03 11:48
2007.11.04
Сохранение инфы с почтового сервера.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский