Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизРабота с функцией 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c