Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Чтение строки из файла через 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
6-1100523164
va
2004-11-15 15:52
2005.01.30
Дозвон и сброс


4-1102701514
Matrex
2004-12-10 20:58
2005.01.30
Cвойства файла в стандартном окне Windows, закладки


3-1103711782
Yurij-7
2004-12-22 13:36
2005.01.30
Вывод структуры таблицы


1-1105530775
dmitryk
2005-01-12 14:52
2005.01.30
Помогите найти компонет


1-1106064885
Рома
2005-01-18 19:14
2005.01.30
Office и Delphi