Форум: "Основная";
Текущий архив: 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