![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение строки из файла [D5, Win2k]
ma5ter © (2006-01-29 15:22:00)Что-то не получается прочитать из бинарника строку по определенному адресу. Кажется я что-то делаю не так ...
type
mTYPE=(mCHAR, mINT, mINT2, mDOUBLE, mFLOAT, mTEXT);
MyConponent=class(TComponent)
private
FImaFile:TMemoryStream;
FFile_Size:integer;
Manufacturer:string;
Function MyComponent.bin2text (input_type:mTYPE; counter:byte; adress:cardinal):string;
published
procedure LoadFromStream(Stream:TStream);
end;
procedure Register;
implementation
constructor MyComponent.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
FImaFile:=TMemoryStream.Create;
end;
destructor MyComponent.Destroy;
begin
FImaFile.Free;
end;
Function MyComponent.bin2text (input_type:mTYPE; counter:byte; adress:cardinal):string;
var s:string;
begin
case input_type of
SUN_CHAR:
begin
GetMem(pS,255);
adr:=Cardinal(pS);
FImaFile.Position:=adress;
FImaFile.Read(pS^,counter);
s:=pS^;//вот здесь ошибка Access violation at address ...
freemem(pS);
end;
result:=s;
end;
Procedure MyComponent.LoadFromStream(Stream:TStream);
begin
FImaFile.LoadFromStream(stream);
FImaFile.Position:=0;
FFile_Size:=FImaFile.Size;
Manufacturer:=bin2text(mCHAR, 9, $60);
end;
Fay (2006-01-29 16:12:00) [1]s:= pS^ будет ползти до первого #0, и не факт, что он найдется в пределах выделенной памяти.
> pS : ^String
Действительно, ужос (с) Eraser
Eraser (2006-01-29 15:49:00) [2]
> ma5ter © (29.01.06 15:44) [5]
Сначала давай реальный код - потом будут советы, то что ты тут выложил - не код, а набор символов, в котором абсолютно нет желания разбираться.
> pS:^string
ужос.
ma5ter (2006-01-29 15:48:00) [3]pS:^string
ma5ter (2006-01-29 15:46:00) [4]да pC это ^char
ma5ter (2006-01-29 15:44:00) [5]2Fay: Это не должно компилироваться, т.к. это пример кода. Кучи кода не относящейся к делу не представлено. А проблемка в предпоследней строке
Manufacturer:=bin2text(mCHAR, 9, $60);, где идет чтение строки 9 символов (mCHAR) из файла находящемся в TMemoryStream по адресу $60.
ma5ter (2006-01-29 15:40:00) [6]Тут другой случай. Я через TFileStream открываю файл и передаю в потоке в стандартную процедуру. Но не в этом дело однозначано. Если добавить:
for i:=0 to counter-1 do
begin
pC:=ptr(adr+cardinal(i));
s:=s+pC^;
end;
вместоs:=pS^;//вот здесь ошибка Access violation at address ...все работает. Почему не работает первый вариант?
Fay (2006-01-29 15:36:00) [7]Где тут строки?
Где здесь файлы?
Что это за фигня (уверен, это даже не компилируется) вАщЕ?
P.S.
SetString тебе в помощь
ma5ter (2006-01-29 15:35:00) [8]а какая разница то?
Eraser (2006-01-29 15:34:00) [9]
> ma5ter © (29.01.06 15:22)
А TFileStream не пробовал использовать?