Главная страница
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.046 c
4-1102505115
Japp
2004-12-08 14:25
2005.01.30
Окно в ДЛЛ.


1-1105708010
про
2005-01-14 16:06
2005.01.30
Kak svernut programku pri pervom ejo zapuske???


1-1105777062
WowaF
2005-01-15 11:17
2005.01.30
Чтение строки из файла через Stream


6-1100605094
V'ent
2004-11-16 14:38
2005.01.30
Удаленный доступ с сети!


3-1104254172
Чеширский_Кот
2004-12-28 20:16
2005.01.30
MySQL Database