Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизЧтение строки из файла через Stream Найти похожие ветки
← →
WowaF (2005-01-15 11:17) [0]Делаю так
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 байт.
Что делаю неправильно?
← →
TUser © (2005-01-15 11:22) [1]Правильно. Строка имеет размер 4 байта. Читай в массив символов или в PChar (только после GetMem). Или по 1 байту считывай в переменную типа char.
← →
MBo © (2005-01-15 11:37) [2]FileStream :=TFileStream.Create("file.txt",fmOpenRead+fmShareDenyNone);
FileStream.Position:=FileStream.Size-32;
SetLength(StringFromFile,32);
FileStream.Read(StringFromFile[1],32);
FileStream.Free;
← →
Anatoly Podgoretsky © (2005-01-15 14:57) [3]FileStream.Read(StringFromFile,32);
Две ошибки - не выделена память по данные, и запись в указатель вместо буфера.
FileStream.Destroy;
Читаем справку и больше никогда не вызываем Destroy напрямую.
← →
WowaF1 (2005-01-15 16:51) [4]нашел вот такое
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 не получается.
Подскажите что неправильно?
← →
WowaF2 (2005-01-15 22:36) [5]А вообще если поставить Stream.Position где-будь в конце и записать длинную сторку то можно нечайно попасть. А вообще как мне узнать где "кочился" exe"шник? Или преобразовать его в txt?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c