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

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

Работа с функцией BlockRead [D7, WinXP]


Страницы:   1 2

Генри ©   (2005-02-25 16:58:00) 

procedure TForm1.Button1Click(Sender: TObject);
var
f:File;
Buf:array [1..255] of Char;
begin
if OpenDialog1.Execute then
AssignFile(f,OpenDialog1.FileName);
Reset(f);
 while not eof(f) do begin
BlockRead(f,Buf,2);
end;
Edit1.Text:=Buf;
CloseFile(f);
end;
end.

Вопрос - почему в Edit1 выводится абракадабра??
PS прошу прощения за дурацкий вопрос.


SVM (Perm)   (2005-03-01 15:31:00) [1]

Разумеется, но речь не идет о явном приведении типа.


begin...end   (2005-03-01 15:25:00) [2]

> SVM (Perm)   (01.03.05 15:17) [20]

Да, но в таких случаях логичнее передавать указатель на массив: MyProc( @Buf) и MyProc( @Buf1).


SVM (Perm)   (2005-03-01 15:17:00) [3]

procedure MyProc(P:PChar);
 begin
 end;

var
    Buf:array[0..10] of Char;
    Buf1:array[1..11] of Char;
begin
 MyProc(Buf);//-OK
 MyProc(Buf1)//-Ругань
end;


begin...end   (2005-03-01 15:10:00) [4]

> SVM (Perm)   (01.03.05 15:09) [18]

Доказательства будут?


SVM (Perm)   (2005-03-01 15:09:00) [5]

Со String совместимы символьные массивы с любой базой.
С PChar - только с базой 0.


Anatoly Podgoretsky   (2005-03-01 13:42:00) [6]

Да без разницы по какому Паскалю, PChar ничего не знает ни про какие индексы, все что изместно, так то что он указывает на какой то символ, не обязательно на первый и предполагается, что эта последовательность заканчивается нулем.


Чапаев   (2005-03-01 13:24:00) [7]

> Недопонял, база ни причем, нормально и array [10..100] of char;
Странно... Значит у меня данные по Паскалю 7. ;-)


Anatoly Podgoretsky   (2005-03-01 13:06:00) [8]

Чапаев ©   (01.03.05 12:46) [14]
Недопонял, база ни причем, нормально и array [10..100] of char;
А PChar совместим с указателем на символ, в расширенном синтаксе на массив символов, и подразумевается, что данный массив оканчивается символом нуля, но это по негласному соглашению.


Чапаев   (2005-03-01 12:46:00) [9]

Кстати, чего-то я недопонял. Насколько известно мне, со string/PChar совместимы символьные массивы с базой 0. А тут база 1. Чего я недопонял?


icWasya   (2005-03-01 12:38:00) [10]

Reset+F1

Reset(f ,1);!!


Eraser   (2005-02-25 21:50:00) [11]

Генри ©

Надо было для решения твоей проблемы выбрать поток (TFileStream), по той причине, что при использовании технологии .NET можно пользоваться только file of text, а типизированые и нетипизированые файлы канули в лету...
Переход к .NET уже не загорами...


Генри   (2005-02-25 17:54:00) [12]

Всем спасибо за помощь! наконец-таки разобрался. всё работает!
спасибо!!!


begin...end   (2005-02-25 17:36:00) [13]

> Генри ©   (25.02.05 17:21) [7]

Если нужно читать из файла два символа, зачем же Вы читаете из него 256байт? Это раз.

Вы должны добавить в массив в нужное место символ с кодом 0 и преобразовать массив к типу String. Это два.

И, наконец, зачем это всё? Чем не подходят текстовые файлы (см. [8])? Это три.


DiamondShark   (2005-02-25 17:32:00) [14]

Не правильно думал.
BlockRead(f,Buf,2) читает не два символа, а два буфера.
По умолчанию (reset без размера буфера) буфер 128 байт.
Значит, читаются 256 байт за раз.
Во-первых, это больше размера переменной (Buf содержит 255 байт), во-вторых, после цикла в переменной останутся последние 256 байт файла (да и то, если размер файла кратен 256).

В общем, бред написан.


Anatoly Podgoretsky   (2005-02-25 17:29:00) [15]

Текстовый файл это F : TextFile;


Генри   (2005-02-25 17:21:00) [16]

2 Anatoly Podgoretsky
Я так думал, что если открывается текстовый файл, то в Edit1 выводится первые два символа этого файла? Нет? поправьте,пожалуйста.


olookin   (2005-02-25 17:19:00) [17]

procedure TForm1.Button1Click(Sender: TObject);
var f: TFileStream;
    Buf:array [1..255] of Char;
begin
if OpenDialog1.Execute then begin
 f:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
 f.Read(Buf,SizeOf(Buf));
 Edit1.Text:=Buf;
 f.Free;
end;
end;


Anatoly Podgoretsky   (2005-02-25 17:11:00) [18]

И если они имеют отношение к тексту, зачем то он пытается бинарные данные загнать в Edit1.Text


begin...end   (2005-02-25 17:09:00) [19]

...если, конечно, эти 256 байт там есть.


begin...end   (2005-02-25 17:08:00) [20]

> Генри ©   (25.02.05 16:58)

Размер массива Buf - 255 байт. А из файла в него читается 256 байт.


Страницы:   1 2

Наверх

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