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

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

  1. ruivit

    ruivit Member

    Репутация:
    0
    Регистрация:
    12 дек 2012
    Сообщения:
    7
    Симпатии:
    0
    Работаю над простейшим 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;
     
  2. sinkopa

    sinkopa Well-Known Member

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Прямо сатанизм какой-то у Вас...:)
    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);
     
  3. ruivit

    ruivit Member

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

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

    sinkopa Well-Known Member

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Непонятненько... :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;
     
Загрузка...
Похожие Темы - Проблема При Считывание
  1. Jayse
    Ответов:
    9
    Просмотров:
    205
  2. thunder
    Ответов:
    55
    Просмотров:
    1.905
  3. Smorti
    Ответов:
    1
    Просмотров:
    452
  4. Denybxx
    Ответов:
    5
    Просмотров:
    1.563
  5. Artael
    Ответов:
    1
    Просмотров:
    296

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