Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Работа с функцией BlockRead   Найти похожие ветки 

 
Генри ©   (2005-02-25 16:58) [0]

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 прошу прощения за дурацкий вопрос.


 
Anatoly Podgoretsky ©   (2005-02-25 17:04) [1]

А что должно быть?


 
Александр Иванов ©   (2005-02-25 17:07) [2]

Принцип SISO


 
begin...end ©   (2005-02-25 17:08) [3]

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

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


 
begin...end ©   (2005-02-25 17:09) [4]

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


 
Anatoly Podgoretsky ©   (2005-02-25 17:11) [5]

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


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

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;


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

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


 
Anatoly Podgoretsky ©   (2005-02-25 17:29) [8]

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


 
DiamondShark ©   (2005-02-25 17:32) [9]

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

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


 
begin...end ©   (2005-02-25 17:36) [10]

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

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

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

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


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

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


 
Eraser ©   (2005-02-25 21:50) [12]

Генри ©

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


 
icWasya ©   (2005-03-01 12:38) [13]

Reset+F1

Reset(f,1);!!


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

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


 
Anatoly Podgoretsky ©   (2005-03-01 13:06) [15]

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


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

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


 
Anatoly Podgoretsky ©   (2005-03-01 13:42) [17]

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


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

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


 
begin...end ©   (2005-03-01 15:10) [19]

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

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


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

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:25) [21]

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
1-1109661973
Sancho
2005-03-01 10:26
2005.03.13
изменить настройки Locale


3-1108471499
salexn
2005-02-15 15:44
2005.03.13
TDbf


1-1109755597
pkm
2005-03-02 12:26
2005.03.13
Как с помощью Delphi в Excel е закрасить ячейку в серый цвет.


14-1109060470
Чеширский_Кот
2005-02-22 11:21
2005.03.13
Разбирающимся в ноутбуках


1-1109606905
ПроНыРа
2005-02-28 19:08
2005.03.13
ListView & PopupMenu