![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение строки из файла через Stream [D7, WinXP]
WowaF © (2005-01-15 11:17:00)Делаю так
var
FileStream: TFileStream;
StringFromFile:String;
begin
FileStream :=TFileStream.Create('file.txt',fmOpenRead+fmShareDenyNone);
FileStream.Position:=Sizeof(FileStream)-32;
FileStream.Read(StringFromFile,32);
FileStream.Destroy;
Выдает ошибку Access violation
Файл существует и имеет размер 156 байт.
Что делаю неправильно?
WowaF2 (2005-01-15 22:36:00) [1]А вообще если поставить Stream.Position где-будь в конце и записать длинную сторку то можно нечайно попасть. А вообще как мне узнать где "кочился" exe'шник? Или преобразовать его в txt?
WowaF1 (2005-01-15 16:51:00) [2]нашел вот такое
procedure AddStrToFile(S:string;const FileName:string;doNextLine:boolean);
{Добавление строки к файлу doNextLine - перевод строки}
const
CR=#13#10;
var
f:TFileStream;
begin
if FileExists(FileName)
then f:=TFileStream.Create(FileName,fmOpenWrite+fmShareDenyNone)
else f:=TFileStream.Create(FileName,fmCreate);
f.Position:=f.Size;
if doNextLine and (f.Size> 0)
then f.Write(CR,2);
f.Write(pointer(s)^,length(s));
f.Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AddStrToFile('information','exe.exe',false);
end;
Я просматривал в редакторе в Exe'шнике все в конце записывается.
Потом
procedure TForm1.Button2Click(Sender: TObject);
var
Buffer: PChar;
MemSize: longint;
Stream: TFileStream;
begin
Stream := TFileStream.Create('exe.exe',fmOpenRead+fmShareDenyNone);
try
MemSize := Stream.Size;
Inc(MemSize); {Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize); {Allocate the memory.}
try
Stream.Position:=MemSize-1024;
Stream.Read(Buffer^, MemSize); {Read Notes field into buffer.}
Memo1.SetTextBuf(Buffer); {Display the buffer's contents.}
end;
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
Это пример из Delphi help . С текстовым файлом все нормально работает а с exe не получается.
Подскажите что неправильно?
Anatoly Podgoretsky (2005-01-15 14:57:00) [3]FileStream.Read(StringFromFile,32);
Две ошибки - не выделена память по данные, и запись в указатель вместо буфера.
FileStream.Destroy;
Читаем справку и больше никогда не вызываем Destroy напрямую.
MBo (2005-01-15 11:37:00) [4]FileStream :=TFileStream.Create('file.txt',fmOpenRead+fmShareDenyNone);
FileStream.Position:=FileStream.Size-32;
SetLength(StringFromFile,32);
FileStream.Read(StringFromFile[1],32);
FileStream.Free;
TUser (2005-01-15 11:22:00) [5]Правильно. Строка имеет размер 4 байта. Читай в массив символов или в PChar (только после GetMem). Или по 1 байту считывай в переменную типа char.