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

Вниз

Как правильно использовать ReadInteger в TReader ?   Найти похожие ветки 

 
TReader   (2005-02-07 04:37) [0]

Где ошибка в следующем коде ?
var
 st      : TStream;
 Reader1 : TReader;
 i, i1   : Integer;
begin
 st := TFileStream.Create("FileName.bin", fmOpenRead or fmShareDenyWrite);
 Reader1 := TReader.Create(st, 16384);
 i1 := Reader1.ReadInteger;

Тут возникает ошибка. Потому, что ридер не может определить разменость i1. Почему и как быть ?


 
jack128 ©   (2005-02-07 04:51) [1]

TReader   (07.02.05 4:37)
Потому, что ридер не может определить разменость i1

А откуда он может узнать то эту размерность??
зы приведи код, которым записывался этот файлик?


 
TReader   (2005-02-07 05:06) [2]


> jack128 ©   (07.02.05 04:51) [1]
> зы приведи код, которым записывался этот файлик?

А не всё равно ?


 
TReader   (2005-02-07 05:21) [3]


> А откуда он может узнать то эту размерность??

А откуда ты знаешь чему равна размерность Integer ? Откуда ?


 
jack128 ©   (2005-02-07 08:44) [4]

TReader   (07.02.05 5:06) [2]
А не всё равно ?


предположим я записал этот файл таким кодом
with TFileStream.Create(FileName, fmCreate) do
try
 WriteBuffer(PChar("SameStr")^, 7);
finally
 Free;
end;
Как считаешь, имеет это значение??

зы. У тебя есть представление о том, зачем нужен класс TReader, TWriter, TFiler ??
TReader   (07.02.05 5:21) [3]
А откуда ты знаешь чему равна размерность Integer ? Откуда ?

Даю наводку: в этом месте файла может храниться не целое число(к слову говоря в Дельфи несколько целочисленных типов, и они имеют разный размер), а например, строка и множество или любой другой тип данных. Естественно ReadInteger все это анализурует и если что не так, то выдает исключение..


 
TReader   (2005-02-08 07:02) [5]


> jack128 ©   (07.02.05 08:44) [4]
> Даю наводку: в этом месте файла может храниться не целое
> число(к слову говоря в Дельфи несколько целочисленных типов,
> и они имеют разный размер),

Integer в Дельфи - 4 байта. Либо как надо явно это указать, чтобы считалось именно 4 байта ?


> предположим я записал этот файл таким кодом
> with TFileStream.Create(FileName, fmCreate) do
> try
>  WriteBuffer(PChar("SameStr")^, 7);
> finally
>  Free;
> end;
> Как считаешь, имеет это значение??

Ты бы ещё спросил, а если ты в текстовом файле написал матерное слово, то откроет ли его блокнот ?

Не имеет. Речь о считывании имеющегося файла, а не о том, как этот файл был создан.


 
Юрий Зотов ©   (2005-02-08 07:18) [6]

> TReader   (07.02.05 04:37)  
> Тут возникает ошибка

Какая именно? Если есть сообщение, то его надо привести, а если получается не то значение, которое ожидалось, то способ записи все же играет роль и его тоже надо привести.


 
MBo ©   (2005-02-08 07:57) [7]

>TReader
Складывается такое впечатление, что ты не воспринимаешь то, что TReader должен читать файлы, созданные с использованием TWriter, а не абы какие.

Запусти этот тест и скажи, почему полученный файл имеет размер 5 байт. И что будет, если вместо первой строки написать i:=10; ?


procedure TForm1.Button1Click(Sender: TObject);
var
 FS: TFileStream;
 Writer: TWriter;
 i: Integer;
begin
 i := $FEDCBA98;
 FS := TFileStream.Create("E:\test.dat", fmCreate);
 Writer := TWriter.Create(FS, 16);
 Writer.WriteInteger(i);
 Writer.Free;
 FS.Free;
end;


 
jack128 ©   (2005-02-08 08:17) [8]

TReader   (08.02.05 7:02) [5]
Ты бы ещё спросил, а если ты в текстовом файле написал матерное слово, то откроет ли его блокнот ?

Не имеет. Речь о считывании имеющегося файла, а не о том, как этот файл был создан.

мдя, а я надеелся на лудшее. TReader + F1  TWriter + F1.  Пока не поймешь в чем назначение этих классов - разговор бессмысленен.


 
Digitman ©   (2005-02-08 08:59) [9]


> TReader


классы TWriter и TReader предваряют данные станд.типов, записываемые/считываемые в/из потока, служебной инф-цией, отражающей типоразмер собственно записываемых/считываемых данных

например, при TWriter.WriteInteger(X) в поток сначала будет записан префиксный байт со значением 2,3 или 4 (в зависимости от значения X), а следом - 1,2 или 4 байта, представляющие значение собственно X

при X := TReader.ReadInteger из потока сначала будет считан ожидаемый префикс.. если если его значение равно 2,3 или 4, то следом в переменную X будет считано (и считанной значение приведено к соотв.типу переменной X) 1,2 или 4 байта соотв-но .. если же значение префикса не равно ни 2-м, ни 3-м, ни 4-м, то TReader возбудит исключение по неверному формату потока .. исключение будет возбуждено TReader"ом также и в случае, если при чтении неожиданно достигнут конец потока и при этом невозможно прочитать из него ожидаемое кол-во байт (в зависимости что считывается - байт префикса или байты значения)



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

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

Наверх




Память: 0.49 MB
Время: 0.032 c
3-1106027922
dark
2005-01-18 08:58
2005.02.20
Мастера Дельфи как избавиться от ошибки Duplicate resource(s)???


14-1106956720
Vadim
2005-01-29 02:58
2005.02.20
Почему программистов считают странными людьми ?


9-1100785213
Вась-Вась
2004-11-18 16:40
2005.02.20
Проблемы с заголовочными файлами DirectX SDK!


3-1106629288
y0zh
2005-01-25 08:01
2005.02.20
Interbase -> Access


9-1101162793
D.Z.
2004-11-23 01:33
2005.02.20
Ой изо-математика