Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2008, 00:09   #1
Kn793
Форумчанин
 
Регистрация: 20.06.2008
Сообщений: 125
По умолчанию file of string[размер больше 20000]

Можно ли как нибудь записать типизированный файл из таких вот string'ов?
TextFile не пойдёт, это я просто упростил задачу. В действидельности там record, включающий в себя string.
Написать string[255] тоже нельзя ибо длинна варируется от 255 до бесконечности(хотя этот момент я не совсем понял).

вот типы: TDB мне надо как нибудь записать
Код:
  Tdata_time = record
    Year   :word;
    Mounth :byte;
    Day    :byte;
    Hour   :byte;
    Minute :byte;
  end;

  Ttegs = record
    count :byte;
    items :array[1..50] of string;
  end;

  TAllTeg = record
    str:string;
    using:integer;
  end;
  TAllTegs = record
    count:integer;
    items: array[1..500] of TAllTeg;
  end;

  TNote = record
    name      :string;
    data_time :Tdata_time;
    tegs      :Ttegs;
    NoteText  :string;
    Materials :string;
    important :byte;
  end;

  TDB = record               //    <<<================== ВОТ ОН, НЕПОКОРНЫЙ
    WriterName  :string;
    WriterDirth :Tdata_time;
    Count:integer;
    Notes: array[1..10000] of TNote;
  end;

Последний раз редактировалось Kn793; 30.12.2008 в 00:11.
Kn793 вне форума Ответить с цитированием
Старый 30.12.2008, 15:43   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Строки в записях типизированных файлов ограничены 255 символами.

Цитата:
до бесконечности(хотя этот момент я не совсем понял)
Бесконечную длину имеет тип string, ограничивается размером свободной памяти. В файл без проблем можно записать любой длины строку, но не в типизированный.
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.
mutabor вне форума Ответить с цитированием
Старый 01.01.2009, 16:12   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 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.
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер 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