Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Алгоритмы и теория программирования


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8229
∙ повысить рейтинг »
Роман Селиверстов
Статус: Академик
Рейтинг: 2756
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2673
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Алгоритмы и теория программирования

Номер выпуска:140
Дата выхода:07.06.2011, 10:30
Администратор рассылки:lamed (Академик)
Подписчиков / экспертов:347 / 162
Вопросов / ответов:1 / 1

Вопрос № 183483: Здравствуйте, уважаемые эксперты! Требуется разработать программу на Delphi-7. Задание Реализовать класс TLog, у которого будет метод Write(S: String); Метод Write будет записывать строчку в файл, добавляя в начало строки текущую дату и вре...



Вопрос № 183483:

Здравствуйте, уважаемые эксперты! Требуется разработать программу на Delphi-7.
Задание
Реализовать класс TLog, у которого будет метод Write(S: String);
Метод Write будет записывать строчку в файл, добавляя в начало строки текущую дату и время.
Имя файла будет задаваться при создании объекта класса TLog, то есть передаваться в конструктор класса.
В случае ошибки записи в файл метод не должен выбрасывать исключительной ситуации.
Объявите класс TLog в отдельной модуле.
Для записи в файл используйте потоки.
Дополнительные задания
1. Файл для записи журнала задавать в файле настроек.
2. Создавать новый файл, если размер файла журнала превысит N байт.
Срок: не поздже 4 июня 10-00.
Если желающие будут - пожалуйста, сообщите не поздней 3 июня 12-00 по Москве
Спасибо.

Отправлен: 02.06.2011, 10:14
Вопрос задал: lamed (Академик)
Всего ответов: 1
Страница вопроса »


Отвечает Киселёва Алёна aka Verena (Профессор) :
Здравствуйте, lamed!
Вот программа. Файл с настройками текстовый, называется ini_file.txt, в нём первой строкой пишем имя файла, второй - допустимую размерность. Если размерность превышена, класс добавляет к текущему имени файла число - номер "продолжения" и создаёт файл с новым именем. Работа с файлами через потоки TFileStream.
Чтобы не было исключительных ситуаций, вся функция записи в блоке try.
Вот исходник модуля с классом:
Код :
unit TLogClass;

interface

uses classes, SysUtils;

type TLog = class
      private
        filename: string;  //имя файла
        number: integer;   //номер продолжения (при создании новых из-за размера)
        max_len: Int64;    //максимальная длина лога
        fl: TFileStream;   //поток
      public
        constructor Create (fname: string; n: longint);
        //конструктор - инициализирует переменные и создаёт поток
        destructor Destroy ();  override;
        //деструктор - уничтожает поток
        function Write (S: string): boolean;
        //функция записи (возвращает false, если возникла ошибка)
      end;

implementation

destructor TLog.Destroy ();
begin
  fl.Free;
  inherited;
end;

constructor TLog.Create(fname: string; n: longint);
begin
  filename := fname;
  max_len := n;
  number:= 0;
  fl:= TFileStream.Create(filename, fmCreate);
end;

function TLog.Write(S: string): boolean;
const
 CR=#13#10;
var
    dt: TDateTime;
    b: string;
begin
  try  //ловим все исключения
    if (fl.Size>=max_len) then begin   //если превысили длину файла
      fl.Free;    //освобождаем поток
      inc (number); //формируем новое имя файла
      filename:= IntToStr (number)+'_'+filename;
      fl:= TFileStream.Create(filename, fmCreate);  //открываем новый поток
    end;
    dt:= Now ();   //берем время
    b:= DateTimeToStr(dt);
    b:= b+'   '+s+#13; //добавляем к строке
    fl.Write(pointer(b)^, length(b)); //пишем в файл
    fl.Write(CR, 2);     //перевод строки пишем в файл
    Write:= true;   //возвращаем true
  except
    Write:= false;  //если были ошибки
  end;
end;

end.

Вот исходник самой программы (в консоли вводятся строки для лога в бесконечном цикле):
Код :
program Log;

{$APPTYPE CONSOLE}

uses
  SysUtils, classes,
  TLogClass in 'TLogClass.pas';

const
 CR=#13#10;       //константа перевода строки

var myLog: TLog;
    s, fn: string;
    i, n: integer;
    ini: TFileStream;
begin                 //чтение из файла настроек
  ini := TFileStream.Create('ini_file.txt', fmOpenRead);
  SetLength (s, ini.Size);
  ini.Read(s[1], ini.Size); //читаем весь файл в строку
  ini.Free;

  i:= pos (cr, s);
  fn:= copy (s, 1, i-1);  //выделяем имя файла
  n:= StrToInt (copy (s, i+2, length(s)-i-1)); //выделяем число N

  myLog := TLog.Create(fn, n);

  while (true) do          //пишем строки в лог
  begin
    readln (s);
    myLog.Write (s);
    writeln ('Exit? y/n');
    readln (s);
    if (s='y') then break;
  end;
end.

На всякий случай, прилагаю проект в Delphi 7.

Удачи! Прикрепленный файл: загрузить »

-----
Эта история - не для истории, понимаешь?

Ответ отправил: Киселёва Алёна aka Verena (Профессор)
Ответ отправлен: 03.06.2011, 01:41
Номер ответа: 267551
Россия, Москва
Адрес: Москва, Солнцево
Адрес сайта: Портал Вникуда: творчество, цитаты, события.
ICQ # 230360822

Оценка ответа: 5
Комментарий к оценке:
Большое спасибо. С уважением.

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267551 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное