Главная страница
    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.042 c
14-1106817355
Vaitek
2005-01-27 12:15
2005.02.20
Школьная геометрия


9-1100491033
ballack
2004-11-15 06:57
2005.02.20
Как избежать наезда спрайтов друг на друга...


3-1105871854
cherrex
2005-01-16 13:37
2005.02.20
DBGRID и Excel


4-1105169458
Unknown
2005-01-08 10:30
2005.02.20
WM_Paste не отслеживается


3-1105635701
Alex_V
2005-01-13 20:01
2005.02.20
Экспорт в форматированный текст





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