Важная информация
Показано с 1 по 10 из 10

Тема: программа работает, но есть вопрос

  1. #1 программа работает, но есть вопрос 
    Новичок
    Регистрация
    02.04.2011
    Сообщений
    14
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Программа работает хорошо, но не большой вопрос нужно ли отключать и включать директиву {I-} и {I+} на месте вопросов (до rewrite и после) ? Объясните почему. пожалуйста.
    Код pascal:
    Program lab;
    uses crt;
    {---------------------------------------------------------------}
    {Процедура открывает файл,имя которого вводит пользователь}
    Function OpenFile(var f:text):boolean;
    var namefile:string;   {имя файла,вводимого пользьзователем}
        res:integer;
        check:boolean;
     begin
        OpenFile:=True;
        check:=true;
        repeat
           write('Введите имя файла с исходным текстом ');
           writeln('(должен быть с расшрением .txt). ');
           write('Для отказа от ввода введите exit: ');
           readln(namefile);
           if (namefile='exit') then
           begin
             check:=False;
             OpenFile:=False;
           end
           else
              assign(f,namefile + '.txt'); {связывание файловой переменной
                                                            с именем файла}
              {$I-}                 {откл.контроль ошибок ввода-вывода}
              reset(f);      {файл инициируется для чтения}
              {$I+}                 {вкл.контроль ошибок ввода-вывода}
              res:=Ioresult;
              if res<>0 then
              writeln('Ошибка.Такого файла не существует.');
        until ((res=0) or (check=False));
     end;
    {---------------------------------------------------------------}
    {Процедура ввода слова,которое нужно посчитать сколько раз оно встречается}
    Procedure EntryWord(var slovo:string);
    begin
       writeln('Введите слово,количество которого нужно посчитать: ');
       readln(slovo);
    end;
    {---------------------------------------------------------------}
    {Данная процедура предназначена для подсчитывания кол-ва слов в файле}
    Procedure PollWord (var f:text;var kolvo:integer;slovo:string);
    var stroka:string;
        Poz:integer;    {номер позиции}
     begin
        while not(eof(f)) do       {пока недостигнет конца файла}
        begin
           readln(f ,stroka);       {считывается строка файла}
           repeat
              Poz:=Pos(slovo,stroka);
              if Poz<>0 then
              begin
                 Delete(stroka,1,(Poz+Length(slovo)));
                 kolvo:=kolvo+1;
              end;
           until (poz=0);               {отсутствие введенного слова}
        end;
        close(f);
     end;
    {-------------------------------------------------------------------}
    {Процедура предназначеная для записывания результатов
                               работы программы в текстовый файл}
    procedure writetxt(kolvo:integer);
    var
      out:text;        {переменная файлового типа}
      name:string;
    begin
       writeln('Укажите путь к файлу, в который будет записан результат.');
       writeln('При нажатии Enter результаты будут записаны в output.txt');
       readln(name);
       if (name = '') then name:='output.txt';
       assign(out,name);
        ??????
       rewrite(out);  {файл инициируется для записи}
        ??????????????????
       writeln(out,'Number of words: ',kolvo,'.');
       close(out);     {закрытие файла}
       write('Результат успешно записано в файл ',name);
    end;
    {----------------------------------------------------------------------}
    var
      kolvo:integer;
      f:text;
      slovo:string;
      OpenFile_:boolean;
    begin
      clrscr;
      writeln('Данная программа предназначена для считывания текста из файла,');
      writeln('подсчитывания сколько раз встречается введенное слово ');
      writeln('и затем запись результата в текстовый файл');
      OpenFile_:= OpenFile(f);
      if OpenFile_ then
      begin
         EntryWord(slovo);
         PollWord(f,kolvo,slovo);
         writetxt(kolvo);
         readln;
      end
      else
         writeln('программа работать не будет.Файл не найден');
      readkey;
    end.
    Последний раз редактировалось Kakos_nonos; 15.04.2011 в 19:51.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,536
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Директива {I-} нужна для отключения отлавливания ошибок ввода-вывода. Если её не писать, то при ошибке ввода/вывода (например, фаил не найден) программа будет просто вылетать.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  3. #3  
    Новичок
    Регистрация
    02.04.2011
    Сообщений
    14
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    но ведь, если файл не найден, он его просто создаст и запишет туда результат... или я не правильно понимаю?
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    С помощью директивы {$I} можно контролировать ошибки ввода вывода. Если она активна, то любая ошибка при операциях с файлами (открытие, запись, чтение) приводит к вылету программы с ошибкой #2. Если директиву отключить, то появляется возможность контролировать ошибки при работе с файлами. Например, в блоке, где происходит работа с файлом, ее можно включить, и после каждой "опасной" операции проверять статус специальной функции - IOResult. Она возвращает 0, если все хорошо, и другое число, если возникли какие либо ошибки.
    Также важно знать, что если директива выключена, и при работе с файлом произошла ошибка, то все дальшейшие операции ввода\вывода (в том числе WriteLn, ReadLn на экран) блокируются, пока не будет сделано обращение к функции IOResult.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  5. #5  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Процедура Reset лишь открывает существующий файл. Если его нет, то будет ошибка. Для создания нового файла служит процедура rewrite. Поэтому необходимо проверять наличие данного файла, что и выполнено в программе.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  6. #6  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,536
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Также при процедуре Rewrite {$I-} будет отлавливать запись на несуществующий диск, перезапись защищённого файла и т д.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  7. #7  
    Новичок
    Регистрация
    02.04.2011
    Сообщений
    14
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    т.е. можно просто поставит директивы, не иcпользуя IOResult или эту функцию тоже надо писать после rewrite?
    Ответить с цитированием  
     

  8. #8  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Если ставиться данная пара директив, то функция IOResult должна быть использована для того, чтобы отловить возможную ошибку.Напротив, если будет включена директива ${I+} то использовать функцию IOResult не имеет смысла.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  9. #9  
    Новичок
    Регистрация
    02.04.2011
    Сообщений
    14
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    спасибо всем
    Ответить с цитированием  
     

  10. #10  
    Новичок
    Регистрация
    02.04.2011
    Сообщений
    14
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    вот что получилось.. работает)))
    Код :
    Program lab;
    uses crt;
    {---------------------------------------------------------------}
    {Процедура открывает файл,имя которого вводит пользователь}
    Function OpenFile(var f:text):boolean;
    var namefile:string;   {имя файла,вводимого пользьзователем}
        res:integer;
        check:boolean;
     begin
        OpenFile:=True;
        check:=true;
        repeat
           write('Введите имя файла с исходным текстом ');
           writeln('(должен быть с расшрением .txt). ');
           write('Для отказа от ввода введите exit: ');
           readln(namefile);
           if (namefile='exit') then
           begin
             check:=False;
             OpenFile:=False;
           end
           else
              assign(f,namefile + '.txt'); {связывание файловой переменной
                                                            с именем файла}
              {$I-}                 {откл.контроль ошибок ввода-вывода}
              reset(f);      {файл инициируется для чтения}
              {$I+}                 {вкл.контроль ошибок ввода-вывода}
              res:=Ioresult;
              if res<>0 then
              writeln('Ошибка.Такого файла не существует.');
        until ((res=0) or (check=False));
     end;
    {---------------------------------------------------------------}
    {Процедура ввода слова,которое нужно посчитать сколько раз оно встречается}
    Procedure EntryWord(var slovo:string);
    begin
       writeln('Введите слово,количество которого нужно посчитать: ');
       readln(slovo);
    end;
    {---------------------------------------------------------------}
    {Данная процедура предназначена для подсчитывания кол-ва слов в файле}
    Procedure PollWord (var f:text;var kolvo:integer;slovo:string);
    var stroka:string;
        Poz:integer;    {номер позиции}
     begin
        while not(eof(f)) do       {пока недостигнет конца файла}
        begin
           readln(f ,stroka);       {считывается строка файла}
           repeat
              Poz:=Pos(slovo,stroka);
              if Poz<>0 then
              begin
                 Delete(stroka,1,(Poz+Length(slovo)));
                 kolvo:=kolvo+1;
              end;
           until (poz=0);               {отсутствие введенного слова}
        end;
        close(f);
     end;
    {-------------------------------------------------------------------}
    {Процедура предназначеная для записывания результатов
                               работы программы в текстовый файл}
    procedure writetxt(kolvo:integer);
    var
      out:text;        {переменная файлового типа}
      name:string;
    begin
       writeln('Укажите путь к файлу, в который будет записан результат.');
       writeln('При нажатии Enter результаты будут записаны в output.txt');
       readln(name);
       if (name = '') then name:='output.txt';
       assign(out,name);
       {$I-}
       rewrite(out);  {файл инициируется для записи}
       {$I+}
       if IOResult<>0 then
        writeln('Ошибка.Запись на несуществующий диск или перезапись защищенного файла и т.д.')
       else
       begin
        writeln(out,'Number of words: ',kolvo,'.');
        close(out);     {закрытие файла}
        write('Результат успешно записано в файл ',name);
       end;
    end;
    {----------------------------------------------------------------------}
    var
      kolvo:integer;
      f:text;
      slovo:string;
      OpenFile_:boolean;
    begin
      clrscr;
      writeln('Данная программа предназначена для считывания текста из файла,');
      writeln('подсчитывания сколько раз встречается введенное слово ');
      writeln('и затем запись результата в текстовый файл');
      OpenFile_:= OpenFile(f);
      if OpenFile_ then
      begin
         EntryWord(slovo);
         PollWord(f,kolvo,slovo);
         writetxt(kolvo);
         readln;
      end
      else
         writeln('программа работать не будет.Файл не найден');
      readkey;
    end.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Есть ли тут джедаи?
    от Кертис в разделе Assembler
    Ответов: 5
    Последнее сообщение: 18.11.2011, 16:24
  2. Серьёзный вопрос о копирайте...
    от >Quiet Snow< в разделе Архив
    Ответов: 6
    Последнее сообщение: 28.09.2011, 19:47
  3. Вопрос администрации
    от Progr в разделе Архив
    Ответов: 7
    Последнее сообщение: 06.06.2011, 11:03
  4. Есть ли аналог $INCLUDE в QBasic
    от uav1606 в разделе QBasic
    Ответов: 4
    Последнее сообщение: 16.02.2011, 04:23
  5. Вопрос по матрице
    от alf в разделе QBasic
    Ответов: 7
    Последнее сообщение: 07.12.2010, 12:53
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •