Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Обработка исключительных ситуаций
Урок _. Файлы. Текстовые файлы План урока
Данные, размещаемые в оперативной памяти компьютера, исчезают при выключении питания. Для долговременного хранения данных используются внешние носители. Единицей хранения информации на диске служит файл (единица представления информации – бит, единица передачи и обработки– байт).
Словом «файл» в программировании называется несколько понятий. Во-первых, это именованная область внешней памяти. Файл в таком понимании называют физическим файлом. Физический файл представляет собой последовательность байт памяти носителя информации – диска, карты памяти. Файл имеет имя, и это имя относится к операционной системе (а не к среде программирования).
Во-вторых, файл – это структура данных, используемых в программировании. Файл в таком понимании называют логическим файлом. Структура логического файла – это способ восприятия файла, образно говоря, это «окно» через которое мы смотрим на физический файл. Чтобы в программе можно было как-то с файлом работать, ему присваивается имя, являющееся обычной переменной.
Существуют средства установки соответствия между этими именами (процедура assign). Иными словами, в Turbo Pascal мы используем одно имя файла, а операционная система, осуществляющая чтение и запись на диск, работает с другим именем. Логический файл описывается как переменная одного из файловых типов, определенных в Turbo Pascal. После того как в программе в разделе описания переменных объявлена файловая переменная, она может быть использована как средство общения с любым физическим файлом. Само имя физического файла появляется в программе один раз, когда устанавливается соответствие имен физического и логического файла.
Файлы классифицируются по двум признакам: по типу (логической структуре) – текстовые, типизированные, нетипизированные; по методу доступа к элементам файла – последовательного и прямого доступа. Метод доступа определяется типом файла.
Примеры: Var f1: text; // textfile F2: file of integer; F3: file;
На этом занятии мы остановимся на работе с текстовыми файлами.
Текстовые файлы являются файлами последовательного доступа. Это значит, что невозможно прочитать (или записать) какой либо элемент, не прочитав (или записав) все предыдущие. При чтении или записи элемента в файл текущая позиция файла перемещается к следующему по порядку элементу.
Информация хранится в текстовых файлах в виде последовательности символов (коды ASCII). Символы составляют строки произвольной длины. В конце каждой строки записываются два управляющих символа #13#10 (возврат каретки и перевод строки), которые отделяют строку от следующей. В конце файла записывается символ #26 – конец файла (CTRL+Z).
С каждым файлом в конкретный момент времени можно работать либо в режиме чтения, либо в режиме записи. Одновременно нельзя. Если необходимо и читать и записывать в файл, то сначала работаем в одном режиме, закрываем и открываем в другом. На чтение можно открыть только существующий файл - процедура reset. Новый файл можно создать и открыть на запись с помощью процедуры rewrite. Если на запись открывается существующий файл, то он автоматически обнуляется, его старое содержимое является безвозвратно утерянным.
С большинством правил чтения данных из текстовых файлов и записи в них результатов работы программы мы знакомы с момента написания первых программ. Дело в том, что в момент начала работы программы всегда автоматически открываются стандартные текстовые файловые переменные input и output. Input – это доступный только для чтения файл, связанный с клавиатурой, а output – это открытый на запись файл, связанный с монитором. И хорошо известные вам процедуры read(ln) и write(ln) – это процедуры чтения и записи в файл соответственно. Если имя файловой переменной не указывается, то чтение происходит из стандартного файла input, а запись – в стандартный файл output.
Var f: text;
Assign(f, ’test.txt’); или s: =’a: \example\test.pas’; Assign(f, s);
Reset(f) – открывает существующий физический файл для чтения. Указатель текущей позиции устанавливается в начало файла. Rewrite(f) – создает новый физический файл. Если такой файл существует, то на его место записывается новый пустой файл. Указатель текущей позиции устанавливается в начало файла.
Close(f) – закрывает открытый файл. Если файл был открыт на запись, переносит последнюю порцию информации из буфера в файл. При этом соответствие, установленное между физическим и логическим файлом, остается и он может быть снова открыт на чтение, дозапись или запись. Обработка исключительных ситуаций При попытке открыть несуществующий файл, возникает ошибка времени исполнения, которую можно подавить, выключая директиву {$I-}. Функция IOResult возвращает 0, если операция завершилась успешно, и ненулевое значение, когда произошла ошибка. Пример 1. Вывести содержимое текстового файла на экран (предварительно создать и поместить рядом с программой). Program ex_1; Uses crt; Var f: text; S: string; Begin Clrscr; {обработка возможных ошибок} assign(f, ’one.txt’); {$I-} reset(f); {$I+} if IOResult < > 0 then writeln(‘файл с таким именем не найден’) else begin {файл найден и открыт на чтение } while not eof(f) do begin readln(f, s); writeln(s); { по умолчанию в файл output } end; close (f); end; end. Внесите изменения в текст, чтобы происходил посимвольный вывод: Program ex_2; Uses crt; Var f: text; S: char; Begin Clrscr; {$I-} {обработка возможных ошибок} assign(f, ’one.txt’); reset(f); {$I+} if IOResult < > 0 then writeln(‘файл с таким именем не найден’) else begin {файл найден и открыт на чтение } while not eof(f) do begin read (f, s); write (s); { по умолчанию в файл output } end; close (f); end; end.
Пример 2. Прочитать из файла четвертый элемент. Program ex_3; Var f: text; I, x: integer; Begin Clrscr; {$I-} {обработка возможных ошибок} assign (f, ’two.txt’); reset (f); {$I+} if IOResult < > 0 then writeln (‘файл с таким именем не найден’) else begin {файл найден и открыт на чтение } i: =0; while (not eof (f)) and (I < 4) do begin read (f, x); I: =i+1; end; writeln(‘четвертый элемент = ‘, x); reset(f); {переустанавливает текущий указатель на первую позицию, если необходимо } ... close (f); end; end. Задачи
Найти: - сумму чисел в файле - количество чисел в файле; - все четные числа переписать в выходной файл; - все простые числа переписать в выходной файл
Результат выведите в файл ‘out.txt’.
Type charset = set of char; Const digits: charset=[‘0’..’9’]; Letters: charset=[‘a’..’z’, ’A’..’Z’]; ...
... readln(f, s); h: =(80 - length(s))div 2; sr: =’’; for i: =1 to h do sr: =sr+’ ‘; {можно писать пробелы по одному в файл, } sr: =sr+s; {но по времени эта операция гораздо дольше} writeln(f, sr); ...
Решение Задача 1
uses crt; var x: integer; s, max: integer; f: text; begin clrscr; {$I-} assign(f, 'isx.pas'); reset(f); {$I+} if ioresult< > 0 then write('try again') else begin s: =0; max: =-32767; while not eof(f) do begin while not eoln(f) do begin read(f, x); s: =s+x; if max< x then max: =x; end; readln(f); end; close(f); append(f); writeln(f); writeln(f, 's==> ', s); writeln(f, 'max==> ', max); close(f); end; END. procedure TForm1.Button1Click(Sender: TObject);
begin if opendialog1.Execute then begin s: =opendialog1.filename; form1.Caption: =s; memo1.Lines.LoadFromFile(S); //----------- assignfile(f, s); reset(f); while not (eof(f)) do begin readln(f, s)
end;
end; end;
procedure TForm1.Button2Click(Sender: TObject);
var s: string; begin if savedialog1.Execute then begin s: =savedialog1.filename; //form1.Caption: =s; //assignfile(f, s); //reset(f);
memo1.Lines.savetofile(s); end; end;
|