Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно записать в нетипезированый файл массив строк.


magical_g ©   (2005-01-29 11:28:00) 

Как можно записать в нетипезированый файл массив строк.

Пример:

Var
ar:array of string[100];
begin
assignfile(f1,'c:\delete.txt');
rewrite(f1,1);

setlength(ar,4);

//занесение данных

BlockWrite(f1,ar,4*100);

Работает некоректно.

Проблема в том, что я их немогу записать даже в виде обыкновенного массива...

procedure TForm1.Button1Click(Sender: TObject);
Var
f1:file;
ar:array of string[100];
temp:integer;
begin

assignfile(f1,'c:\delete.txt');
rewrite(f1,1);

SetLength(ar,2);
ar[0]:='1';
ar[1]:='2';

BlockWrite(f1,ar[0],SizeOf(ar[0])*sizeof(char),temp);

closefile(f1);

end;

procedure TForm1.Button2Click(Sender: TObject);
Var
f1:file;
ar:array of string[100];
temp:integer;
begin

assignfile(f1,'c:\delete.txt');
reset(f1,1);

SetLength(ar,2);
ar[0]:='';
ar[1]:='';

BlockWrite(f1,ar[0],SizeOf(ar[0])*sizeof(char),temp);
closefile(f1);

end;


Anatoly Podgoretsky   (2005-01-29 14:05:00) [1]

В крайнем случае типизированный файл.


Anatoly Podgoretsky   (2005-01-29 14:00:00) [2]

Здесь прекрасно подходит текстовый файл.
Зачем мудрить с нетипизированным? Цель какая?


magical_g   (2005-01-29 13:15:00) [3]

Ой извиняюсь, незаметил, ща попробую!


begin...end   (2005-01-29 12:58:00) [4]

> [6] magical_g   (29.01.05 12:50)

Я не понял, Вы [2] попробовали?

> Зачем мне писать длину строки в файл

Так делают при записи длинных строк.


magical_g   (2005-01-29 12:50:00) [5]

Ну и. Зачем мне писать длину строки в файл, если при фиксированиой длинне результат не верный...
Я то буду знать сколько читать, но сейчас и зная это проблема не решилась!


Jel   (2005-01-29 12:43:00) [6]


> Может быть, лучше проверять свои предположения перед их
> озвучиванием?

Да, как верно подметил гражданин Маркс - "Теория без практики мертва". Впредь будем проверять перед озвучиванием. :)


begin...end   (2005-01-29 12:26:00) [7]

> [3] Jel ©   (29.01.05 12:20)

> Нет, это придумал Borland, когда разрабатывал концепцию
> "длинных строк" (AnsiString и WideString).

В приведённом коде НЕ используются длинные строки. Поэтому непонятно, к чему Вы это вообще сказали.

> А поскольку автор ветки использует динамический массив -
> все элементы в нем будут указателями, невзирая на объявление
> string[100].

Размер указателя составляет 4 байта. Размер каждого элемента динамического массива, состоящего из коротких строк String[100], будет равен 101 байту. Вы можете в этом убедиться, используя функцию SizeOf. Вас это ни на какие мысли не наводит? Может быть, лучше проверять свои предположения перед их озвучиванием?


Jel   (2005-01-29 12:20:00) [8]


> > Массив строк на самом деле представляет собой массив указателей
>
> > на строки
>
> Это Вы сами придумали?


Нет, это придумал Borland, когда разрабатывал концепцию "длинных строк" (AnsiString и WideString). А поскольку автор ветки использует динамический массив - все элементы в нем будут указателями, невзирая на объявление string[100].


begin...end   (2005-01-29 11:53:00) [9]

> magical_g   (29.01.05 11:28)

> procedure TForm1.Button1Click(Sender: TObject);

> BlockWrite(f1,ar[0],SizeOf(ar[0])*sizeof(char),temp);

BlockWrite(f1, ar[0], SizeOf(ar[0]) * Length(ar), temp)

> procedure TForm1.Button2Click(Sender: TObject);

> BlockWrite(f1,ar[0],SizeOf(ar[0])*sizeof(char),temp);

BlockRead(f1, a[0], SizeOf(ar[0]) * Length(ar), temp)

> [1] Jel ©   (29.01.05 11:34)

> Массив строк на самом деле представляет собой массив указателей
> на строки

Это Вы сами придумали?


Jel   (2005-01-29 11:34:00) [10]

Массив строк на самом деле представляет собой массив указателей на строки, поэтому писать и читать его нужно построчно. Я бы писал так:

Количество строк в массиве
Длина первой строки
Сама строка
Длина N-ой строки
Сама строка

и так до конца.


Наверх

Титульная страница Поиск, карта сайта Написать письмо