|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.12.2008, 00:09 | #1 |
Форумчанин
Регистрация: 20.06.2008
Сообщений: 125
|
file of string[размер больше 20000]
Можно ли как нибудь записать типизированный файл из таких вот string'ов?
TextFile не пойдёт, это я просто упростил задачу. В действидельности там record, включающий в себя string. Написать string[255] тоже нельзя ибо длинна варируется от 255 до бесконечности(хотя этот момент я не совсем понял). вот типы: TDB мне надо как нибудь записать Код:
Последний раз редактировалось Kn793; 30.12.2008 в 00:11. |
30.12.2008, 15:43 | #2 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Строки в записях типизированных файлов ограничены 255 символами.
Цитата:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 30.12.2008 в 15:45. |
|
01.01.2009, 16:12 | #3 |
фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714
|
Здравствуй Kn793 !
Помогу немоного разобратся в проблеме, с котороя я тоже пару раз встречался. - во первых типизированные файлы переменой длины (т.е.) с типами на подобии string, pchar, и.т.п лучше лучше задавать через packed record (при вводе/выводе могут возникнуть проблемы с несоответсвием считанной информации той что записывается) - во вторых я бы реализовал так: type ....... предыдущие ползовательские типы ........ TNote = packed record name :string; data_time : Tdata_time; tegs : Ttegs; NoteText : string; Materials : string; important : byte; end; TDB = packed record WriterName :string; WriterDirth :Tdata_time; Count:integer; Notes: array of TNote; // переменной длины end; implementation //*********************************** ******************* //** БЛОК ЧТЕНИЯ **// //*********************************** ******************* // ****************** ЧИТАЕМ СТРОКУ "ЛЮБУЮ" ************** // string в Паскале имеет структуру // ДЛИНА+ПОЛЕЗНАЯ ИНФОРМАЦИЯ // ДЛИНА= 4 байт (и всегда находится по адресу переменной) // полезная информация хранится с 1-го байта и далее function ReadString(Stream : TFileStream):string; var len : integer; begin Stream.Read(len,4); SetLenGth(result,len); if len>0 then Stream.Read(@result[1],len); end; // ****************** ЧИТАЕМ ВАШ NOTE ************** function ReadNoteRecord(Stream : TFileStream):TNote; begin FillChar(result, SizeOf(TNote)); with result do begin name :=ReadString; Stream.Read(data_time, SizeOf(Tdata_time)); // tegs : Ttegs; <-- если это массив читаем его так-же как и // ReadNoteRecord иначе Stream.Read(tegs, SizeOf(Ttegs)); NoteText :=ReadString; Materials :=ReadString; Stream.Read(important, 1); end; end; // ****************** ЧИТАЕМ ВАШ TDB ************** // указатель потока (TFileStream.Position) должен находиться // в начале записи TDB. То есть при вызове данной функции // Вы должны считать все header-ы, TDB-count-ы и.т.п function ReadTDBRecord(Stream : TFileStream):TDB; var i : integer; begin with result do begin Finalize(Notes); // чистим мусор !!! обязательно WriterName:=ReadString; WriterDirth:=Stream.Read(WriterDirt h, SizeOf(Tdata_time)); Count :=Stream.Read(Count, SizeOf(integer)); SetLenGth(Notes, Count); for i:=0 to Count-1 do Note[i]:=ReadNoteRecord(Stream); end; end; //*********************************** ******************* //** БЛОК ЗАПИСИ **// //*********************************** ******************* procedure WriteString(Stream : TFileStream; const Str:string); var len : integer; begin len:=LenGth(Str); Stream.Write(len,4); if len>0 then Stream.Write(@Str[1]); end; // ****************** ПИШЕМ ВАШ NOTE ************** procedure WriteNoteRecord(Stream : TFileStream; Value:TNote); begin with Value do begin WriteString(Stream,Name); Stream.Write(data_time, SizeOf(Tdata_time)); // tegs : Ttegs; <-- если это массив пишем его так-же как и // WriteNoteRecord иначе Stream.Write(tegs, SizeOf(Ttegs)); WriteString(Stream,Name); WriteString(Stream,NoteText); WriteString(Stream,Materials); Stream.Write(important, 1); end; end; // ****************** ПИШЕМ ВАШ TDB ************** procedure WriteTDBRecord(Stream : TFileStream: DB:TDB); var i, rcount : integer; begin with DB do begin WriteString(Stream,Name); Stream.Write(WriterDirth, SizeOf(Tdata_time)); rcount:=LenGth(Notes); Stream.Write(rCount, SizeOf(integer)); for i:=0 to rCount-1 do WriteNoteRecord(Stream,Note[i]); end; end; end. НАДЕЮСЬ КОД ЧЕМ-ТО ПОМОЖЕТ
95% сбоев и ошибок приложений, находится в полу метрах от монитора
Последний раз редактировалось JUDAS; 01.01.2009 в 20:17. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Размер Image изменяется на размер картинки, а сама она рисуется на области первой картинки | RPGer | Мультимедиа в Delphi | 6 | 20.10.2008 19:54 |
Логотип какого поисковика вам нравится больше? | Hallo | Свободное общение | 7 | 26.06.2008 09:26 |
Хотелось бы узнать чуть больше про фильтрацию!!! | Alexij | БД в Delphi | 4 | 17.04.2008 13:56 |
Какой язык программирования вы любите/уважаете больше остальных? | theos | Свободное общение | 3 | 14.12.2007 17:47 |
Числа вводим опока не будет больше ста. (Задачка) | Vanet | Помощь студентам | 3 | 12.10.2007 00:52 |