Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
8-1101423024
ункновн
2004-11-26 01:50
2005.03.13
Обработка изображения в Direct3D


4-1106906105
grigory
2005-01-28 12:55
2005.03.13
Послать сообщение CheckBox у!


1-1109234272
Zhekson
2005-02-24 11:37
2005.03.13
запуск процедур в отдельных потоках


3-1107944179
a-tester
2005-02-09 13:16
2005.03.13
Хранимая процедура не выполняется из программы


3-1107951768
vvv_spb
2005-02-09 15:22
2005.03.13
SELECT FROM JOIN





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский