Немного о файлах. Часть 3

В этом выпуске:

  1. Тысячи извенений
  2. Обработка ошибок
  3. Новые процедуры
  4. Программка для практики


И снова, здравствуйте. Давненько мы с вами не виделись. Но прошу не обижаться на меня. Для меня это были трудные дни: "ликвидация хвостов", сессия, военная кафедра (все каникулы), грипп... Но, я думаю, мы наверстаем упущенное. Итак приступим.

Опять мне приходится начинать статью с извинений. Дело в том, что в последней программе рассылки "Немного о файлах. Часть 2", опять же по моей вине произошла ошибка. Так, при переносе файла из Pascal'я в блокнот, где верстается статья, произошли проблемы с кодировкой символов. В результате строки, которые были написаны в исходном варианте как

    YesChars  = ['Y', 'y', 'Н', 'н'];
    NoChars   = ['N', 'n', 'Т', 'т'];

в статье изменились на

    YesChars  = ['Y', 'y', '-', '?'];
    NoChars   = ['N', 'n', ''', 'в'];

Признаю свою вину, обещаю исправиться. Надеюсь вы не будете за это сильно ругаться, и мы можем продолжить.

До сих пор мы работали с файлами не заботясь об ошибках, которые могут при этом возникать. Когда это было необходимо, я указывал под каким именем сохранять файл. И, если вы все делали правильно, то проблем не должно было быть. Однако наиболее пытливые из вас могли увидеть при запуске программы что-нибудь типа:

Error 2: File not found.

сие значит: "Ошибка 2 : Файл не найден". Таким образом, перед нами возникает задача определения наличия файла. На начальном этапе обучения мы пока будем отрабатывать ошибки ввода\вывода в файл, который находится в текущем каталоге. Другие ситуации рассмотрим позже.

Так для решения нашей задачи вполне подходит функция IOResult. Ее описание:

function IOResult: Integer;

Эта функция возвращает код завершения последней операции ввода\вывода. Все, что нам надо знать по этим кодам это то, что в случае успешной операции функция вернет значение ноль. Т.е., если не ноль, значит возникла ошибка (редко надо знать какая именно), и программа продолжает свою работу (а может и не продолжает - решать вам), в соответствии с этой ошибкой. Для использования этой функции следует отключить контроль ввода\вывода. Делается это с помощью директивы компилятора - {$I-}. Включить контроль В\В можно с помощью директивы - {$I+}. По умолчания контроль В\В всегда включен. На практике все это может выглядеть следующим образом:

        .
        .
        .
     	{$I-}
     	Reset(F);
	{$I+}
	If  IOResult  <>  0 then 
     		Write('Ошибка.');     
	else
	      Write('Все в порядке.');
	  .
	  .
	  .

где F - файловая переменная любого типа.

Следует отметить, что контроль В\В не следует отключать надолго. Включайте его сразу, как только это возможно. Да кстати, после считывания IOResult, она потеряет свое значение. Например, если в следующем случае возникнет ошибка (файл не существует), то на экран будут выведены разные числа, можете проверить:

	.
	.
	.
   {$I-}
   Reset(F);
   {$I+}
   WriteLn(IOResult);
   WriteLn(IOResult);   
	.
	.
	.

Разберем еще несколько процедур.

Процедура Seek.

Эта процедура устанавливает указатель на определенный элемент файла. Ее описание:

             procedure Seek(var F; N: Longint);

здесь F - файловая переменная любого типа за исключением текстового, N - индекс устанавливаемого элемента в файле. Следует учесть, что счет элементов файла ведется с нуля, поэтому, чтобы установить указатель на первый элемент файла следует записать Seek(F, 0);.

Функция FilePos

Эта функция возвращает номер элемента, на который установлен указатель. Ее описание:

             function FilePos(var F): Longint;

где F - файловая переменная любого типа, кроме текстового. Нужно помнить, что для применения процедуры Seek и функции FilePos, файл, передаваемый в качестве параметра должен быть предварительно открыт, в противном случае возникнет ошибка. Для закрепления вышесказанного поэкспериментируйте со следующей программкой:

var
    F  : file of byte;
    b  : byte;
begin
    Assign(F, 'Test1.pas');
    Reset(F);
    For b := 1 to 9 do
        Write(F, b);
    Seek(F, 2);
    Read(F, b);
    WriteLn(b);
    Seek(F, FilePos(F)+2);
    Read(F, b);
    WriteLn(b);
    Close(F);
end.

На последок хочу привести вам интересную программку. Предварительно скажу, что все строки оканчиваются символами с кодами 13 и 10. И при выводе на экран, если встречается такая последовательность символов, то курсор переводится на новую строку. Теперь в окне редактора вашего Pascal'я создайте какой-нибудь файл (в котором будет больше одной строки), сохраните его под именем Stich.pas и закройте. Запустите нижеприведенную программу и вновь откройте Stich.pas.

Uses
    CRT;
const
    FName = 'Stich.pas';
    cCh :char= '?';
var
    F  : file of char;
    ch : char;
begin
    Assign(F, FName);
    {$I-}
    Reset(F);
    {$I+}

    If IOResult <> 0 then
       begin
           WriteLn;
           WriteLn('Can not open file ', FName);
           Write('Press any key...');
           ReadKey;
           Halt(1);
end;

    While not Eof(F) do
       begin
           Read(F, ch);
           If (ch=#13) or (ch=#10) then
              begin
                Seek(F, FilePos(F)-1);
                Write(F, cCh);
              end;
       end;
    Close(F);
end. 	   

В результатах попробуйте разобраться сами.

Желаю удачи.

[ в начало ] [спрашивайте]

© Чарышкин Олег

Рассылку поддерживает сайт www.turbopascal.tk

Hosted by uCoz