Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

Как правильно использовать 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
3-1106044778
Sectey
2005-01-18 13:39
2005.02.20
Отслеживание Print на клиенте (ADO)


14-1106938821
Cobalt
2005-01-28 22:00
2005.02.20
закачка на FTP


3-1106648690
Sergilov
2005-01-25 13:24
2005.02.20
Как узнать текущий формат даты в Access???


3-1106402538
Desdechado
2005-01-22 17:02
2005.02.20
ClientDataset.PacketRecords и EOF


14-1107059506
ЮЗверь!
2005-01-30 07:31
2005.02.20
Content-Type





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский