![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка чтения файла при использовании PStream [Delphi, Windows]
Lari © (2006-10-25 08:24:00)Использую PStream для чтения бита из exe-шника самой программы, при этом если после указанного чтения провести чтение стандартными функциями API из другого файла находящегося в допустим в этой же дирестории (1.txt) происходит ошибка. Переменная используемая для получения информации (в моем случае rf) получает какое-то левое значение и после чтения файла в конец полученной из файла строки добавляется какой-то дополнительный символ.
Текст программы
program Prog;
uses Windows, kol;
var
Msg: TMsg;
ps: PStream;
s: byte;
function rFile() : String;
var hfl : HFile;
size : dword;
rf : PChar;
ofs : OFSTRUCT;
begin
Result := '';
GetMem(rf,256);
hfl := OpenFile('1.txt',ofs,OF_READ);
ReadFile(hfl,rf^,255,size,nil);
Result := rf;
FreeMem(rf);
CloseHandle(hfl);
end;
Begin
ps := NewReadWriteFileStream(ParamStr(0));
ps.Seek($10,spBegin);
ps.Read(s,sizeof(s));
ps.Free;
MessageBox(0,PChar(rFile),0,0);
exit;
while GetMessage( Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Если же закоментировать четыре строки
{
ps := NewReadWriteFileStream(ParamStr(0));
ps.Seek($10,spBegin);
ps.Read(s,sizeof(s));
ps.Free;
}
то чтение из текстового файла просиходит нормально.
Подсткажите пожалуйста почему происходит такая ошибка и как ее можно устранить.
Lari (2006-10-26 08:18:00) [1]Спасибо, Thaddy, использование функции FillChar (Allocmem) решило вопрос.
Vedun (2006-10-25 15:13:00) [2]Я это знаю. Я имел в виду другое. Неверно выразился. Ладно, проехали.
nicesc (2006-10-25 14:38:00) [3]$ -это 16ричное представление числа
$1 - 1в десятичной
..
$a - 10
..
$10 - 16
Vedun (2006-10-25 12:02:00) [4]Что такое $10 в аргументах метода Seek?
Thaddy (2006-10-25 09:58:00) [5]
function rFile() : String;
var hfl : HFile;
size : dword;
rf : PChar;
ofs : OFSTRUCT;
begin
Result := '';
GetMem(rf,256);//<-------------You allocate dirty memory of 256 bytes
hfl := OpenFile('1.txt',ofs,OF_READ);
ReadFile(hfl,rf^,255,size,nil);<---------- you read only 255:
//No wonder there's an extra random byte!
Result := rf;
FreeMem(rf);
CloseHandle(hfl);
end;
Tryrf:=Allocmem(255{or 256 if you want});
It uses clean memory.
The readfile function does not automatically convert to a pchar so the last byte of your buffer is undefined.