Проблема При Считывание И Записи В Файл С Помощью Объекта Tfilestream

12.12.2012
7
0
#1
Работаю над простейшим html редактором...
Считываю текст кода с текстового файла и вывожу его в Memo1.
Далее с помощью этого же массива записываю в другой файл.
В результате в Memo1 html код и марокасятина...
В Index.html тоже html код и снова марокасятина только еще больше....

Вот код:

Код:
  const
adres1= 'C:\IditHTML\hablon\index.txt';
var
buf1: array [0..2500] of char;

NameProekt,AdresProekt,SummaProekta: string;

// fHtmlHablon шаблон html
// fHtmlIndex создаваемый файл

fHtmlHablon, fHtmlIndex: TFileStream;
begin

// Забиваем NameProekt имя проекта	AdresProekt его адрес
NameProekt:= Edit1.Text;
AdresProekt:= Edit2.Text;
SummaProekta:= AdresProekt + NameProekt;

//проверяем существования папки подобной по данному адресу
if DirectoryExists(SummaProekta) = true then
showmessage('Извиняй но подобный проект есть');

// Если в подобного проекта нету значит создаем для него папки
if createdir(SummaProekta) = true then
if createdir(SummaProekta + '\css') = true then
if createdir(SummaProekta + '\img') = true then
showmessage('Каталок папок создан');


// Считываем шаблон 
fHtmlHablon:= TFileStream.Create(adres1, fmOpenRead);
fHtmlHablon.Read(buf1,2500);
fHtmlHablon.Free;
Form1.Memo1.Lines.Add(buf1);


//=================================


// Создаю файл index.html
fHtmlIndex:= TFileStream.Create(SummaProekta + '\index.html', fmCreate);
fHtmlIndex.Write(buf1,2500);
fHtmlIndex.Free;
showmessage('Файл создан');


end;
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Работаю над простейшим html редактором...
Считываю текст кода с текстового файла и вывожу его в Memo1.
Далее с помощью этого же массива записываю в другой файл.
В результате в Memo1 html код и марокасятина...
В Index.html тоже html код и снова марокасятина только еще больше....
Прямо сатанизм какой-то у Вас...:)
2500 - случайно не число компьютерного дьявола? :)
(1) Если длина fHtmlHablon у Вас меньше 2500, то длина "марокасятины" у Вас буден равна: 2500 - длина fHtmlHablon (потому что буфер Вы предварительно нулями не заполнили).
(2)Если длина fHtmlHablon у Вас больше 2500, то длина "марокасятины" у Вас буден равна: Длина fHtmlHablon - 2500 (потому что в буфер Вы прочитали "всякую хрень" лежащую на диске за пределами файла. По идее, конечно, ощибка чтения должна выскакивать).
(3) Если в буфере у Вас строчка меньше чем 2500, то в fHtmlIndex зальете "марокасятину" длиной: 2500 - реальная длина строчки в буфере
Короче...
Воперых - нужно размер буфера и размер чего вы (читаете/пишете) согласовывать и буфер сам чистить
Код:
var
buf1: array of AnsiChar;
fHtmlHablon, fHtmlIndex: TFileStream;
bufLen: Integer;

begin
// Считываем шаблон
fHtmlHablon:= TFileStream.Create(adres1, fmOpenRead);
bufLen := fHtmlHablon.Size+1;
SetLength(buf1,bufLen);
ZeroMemory(@buf1[0],bufLen);

fHtmlHablon.Read(buf1[0],bufLen-1);
fHtmlHablon.Free;
Form1.Memo1.Lines.Add(AnsiString(PAnsiChar(@buf1[0])));
// а лучше бы так :  Form1.Memo1.Lines.Text := AnsiString(PAnsiChar(@buf1[0]));

//=================================


// Создаю файл index.html
bufLen := Length(buf1)-1;
if (bufLen > 0) then
begin
fHtmlIndex:= TFileStream.Create(SummaProekta + '\index.html', fmCreate);
fHtmlIndex.Write(buf1[0],bufLen);
fHtmlIndex.Free;
showmessage('Файл создан');
end
else
showmessage('буфер пуст');

end;
А во вторых... Что интересно, мешает Вам в Memo1 читать/писать прямо через TFileStream?
Код:
  fHtmlHablon:= TFileStream.Create(adres1, fmOpenRead);
Form1.Memo1.Lines.LoadFromStream(fHtmlHablon);

//=================================
fHtmlIndex:= TFileStream.Create(SummaProekta + '\index.html', fmCreate);
Form1.Memo1.Lines.SaveToStream(fHtmlIndex);
 
12.12.2012
7
0
#3
Нет [sub]2500[/sub] любимое число ;) Я его почему то всегда пишу.... ;)

Принципе можно и так в Memo1 читать и писать прямо через TFileStream, это даже гораздо удобнее. Но при копирование с разных других шаблонов, обработка и создания готового index.html создаст проблемы... Так я думаю...
 

sinkopa

Well-known member
17.06.2009
344
4
#4
Нет [sub]2500[/sub] любимое число :) Я его почему то всегда пишу.... :D
Принципе можно и так в Memo1 читать и писать прямо через TFileStream, это даже гораздо удобнее. Но при копирование с разных других шаблонов, обработка и создания готового index.html создаст проблемы... Так я думаю...
Непонятненько... :mellow:
ну да ладно... А скажите-ка... а почему нельзя вообще TStringList-ы использовать?
Код:
  list1 := TStringList.Create;
list2 := TStringList.Create;

list1.LoadFromFile(adres2);
list2.LoadFromStream(fHtmlHablon);

Form1.Memo1.Lines.LoadFromFile(adres1);
Form1.Memo1.Lines.AddStrings(list1);
Form1.Memo1.Lines.AddStrings(list2);

list1.Clear;
list1.Assign(Form1.Memo1.Lines);
list1.SaveToFile(SummaProekta + '\index.html);

list1.Free;
list2.Free;