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

Тема в разделе "Pascal and Delphi", создана пользователем ruivit, 12 дек 2012.

  1. ruivit

    ruivit Member

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

    Вот код:

    Код (Delphi):
      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;
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Прямо сатанизм какой-то у Вас...:)
    2500 - случайно не число компьютерного дьявола? :)
    (1) Если длина fHtmlHablon у Вас меньше 2500, то длина "марокасятины" у Вас буден равна: 2500 - длина fHtmlHablon (потому что буфер Вы предварительно нулями не заполнили).
    (2)Если длина fHtmlHablon у Вас больше 2500, то длина "марокасятины" у Вас буден равна: Длина fHtmlHablon - 2500 (потому что в буфер Вы прочитали "всякую хрень" лежащую на диске за пределами файла. По идее, конечно, ощибка чтения должна выскакивать).
    (3) Если в буфере у Вас строчка меньше чем 2500, то в fHtmlIndex зальете "марокасятину" длиной: 2500 - реальная длина строчки в буфере
    Короче...
    Воперых - нужно размер буфера и размер чего вы (читаете/пишете) согласовывать и буфер сам чистить
    Код (Delphi):
    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?
    Код (Delphi):
      fHtmlHablon:= TFileStream.Create(adres1, fmOpenRead);
    Form1.Memo1.Lines.LoadFromStream(fHtmlHablon);

    //=================================
    fHtmlIndex:= TFileStream.Create(SummaProekta + '\index.html', fmCreate);
    Form1.Memo1.Lines.SaveToStream(fHtmlIndex);
     
  3. ruivit

    ruivit Member

    Регистрация:
    12 дек 2012
    Сообщения:
    7
    Симпатии:
    0
    Нет [sub]2500[/sub] любимое число ;) Я его почему то всегда пишу.... ;)

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Непонятненько... :mellow:
    ну да ладно... А скажите-ка... а почему нельзя вообще TStringList-ы использовать?
    Код (Delphi):
      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;
     
Загрузка...

Поделиться этой страницей