Все предыдущие примеры программ на этом сайте выводили данные непосредственно на экран компьютера. Но данные можно выводить в файлы на внешние носители.
Рассмотрим пример программы на PascalABC, которая считывает исходные данные из внешнего файла. Считает сумму и произведение. Записывает результат тоже во внешний файл.
Но прежде немного справочной информации.
Текстовые файлы Паскаль
Файл — это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами.
В Паскале для связи программы с файлом служит файловая переменная, которая обязательно должна быть указана в разделе описаний VAR.
f1,f2: text; {текстовые файлы}
Текстовый файл в PascalABC — это совокупность строк произвольной длины, разделенных между собой маркерами конца строки, а весь файл заканчивается маркером — конец файла.
Текстовые файлы являются файлами с последовательным доступом. В любой момент времени доступна только одна запись файла. Другие записи становятся доступными лишь в результате последовательного продвижения по файлу.
Чтобы программа смогла различать записи данных в текстовом файле, их разделяют пробелами. Например, 20 30 45 озеро.
Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Аssign.
assign(f1,'inp/input.txt'); {исходный текстовые файл с данными} assign(f2,'res/output.txt'); {текстовый файл для вывода результатов}
Имя внешнего файла при необходимости должно содержать абсолютный путь доступа к этому файлу, включая имя дисковода. При этом имя внешнего файла – строковая величина, т.е. должна быть заключена в апострофы. В нашем примере путь к файлу относительный.
Наши файлы расположены в рабочем каталоге PascalABC (C:\PABCWork).
Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть “открыта”. Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи.
reset(f1); {открываем файл для чтения данных} rewrite(f2); {открываем файл для вывода результатов}
Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяют вам считывать и записывать значения, тип которых отличается от символьного типа. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i — переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.
В нашей программе это строка ниже:
read(f1,x,y,k); {ввод значений х,y,k из файла}
Далее идут команды обработки данных:
z := x + y + k; {вычисление суммы} p := x * y * k; {вычисление произведения}
Выводим найденные результаты во внешний текстовый файл
writeln(f2,'Сумма = ',z); {вывод результата сложения в файл} writeln(f2,'Произведение = ',p); {вывод результата произведения в файл}
Перед тем как закончить работу, необходимо закрыть все файлы, которые были использованы программой. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено.
close(f1); { закрываем файл с данными } close(f2); { закрываем файл с результатами }
Итак, запишем код программы целиком.
Задача 1. Даны три целых числа. Найдите их сумму и произведение. Исходные данные находятся в файле Input.txt. Результаты вывести в файл Output.txt.
program zadanie1; var x,y,k,z,p:integer; {описание переменных} f1,f2: text; {текстовые файлы} begin { начало программы} assign(f1,'inp/input.txt'); {исходный текстовые файл с данными} assign(f2,'res/output.txt'); {текстовый файл для вывода результатов} reset(f1); {открываем файл для чтения данных} rewrite(f2); {открываем файл для вывода результатов} read(f1,x,y,k); {ввод значений х,y,k из файла} z := x + y + k; {вычисление суммы} p := x * y * k; {вычисление произведения} writeln(f2,'Сумма = ',z); {вывод результата сложения в файл} writeln(f2,'Произведение = ',p); {вывод результата произведения в файл} close(f1); { закрываем файл с данными } close(f2); { закрываем файл с результатами } end. { конец программы }
Перед запуском программы не забудьте сохранить её в рабочем каталоге (C:\PABCWork). Иначе относительный путь к файлу с данными не будет найден.
Для создания исходного файла с данными в PascalABC, создайте новый документ. Запишите числа через пробел и сохраните в нужное место, указав после имени файла расширение txt. В диалоге сохранения Тип файла укажите Все файлы. Также можно воспользоваться программой Блокнот.
Произведение = 1610
Дополнительные функции работы с текстовыми файлами
- Процедура Аppеnd
Процедура Аppеnd открывает существующий внешний файл с именем, назначенным переменной f. Если внешнего файла с указанным именем не существует, то это является ошибкой. Если файл f уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла.
- Функция Еоf
Параметр f представляет собой файловую переменную, определяющую текстовый файл. Если этот параметр опущен, то используется стандартная файловая переменная Input. Если текущая позиция в файле находится за последним элементом файла или если файл не содержит никаких элементов, то функция Еоf(f) возвращает значение Тruе. В противном случае она возвращает значение False.
- Функция Eoln
Eoln(f) возвращает True, если текущая позиция в файле совпадает с маркером конца строки или если истинна функция Eof(f); в противном случае Eoln(f) возвращает False.
Задача 2. В файле input.txt записаны целые числа. Количество чисел неизвестно. Напишите программу, которая вычисляет сумму всех чисел в файле и записывает результат в этот же файл после чисел. Формат результата — «Сумма чисел =».
program zadanie2; var b, s: longint; {описание переменных} f: text; {текстовый файл} begin assign(f, 'input.txt'); {исходный текстовые файл с данными} reset(f); {открываем файл для чтения данных} s:=0; {обнуляем сумму} while not eof(f) do {цикл-пока не закончатся числа в файле} begin read(f,b); {читаем число} s := s + b; {выполняем суммирование чисел} end; close(f); { закрываем файл с данными } append(f); {открываем файл для дозаписи результатов} writeln(f); {переходим на новую строку в файле} write(f,'Сумма чисел = ',s);{вывод результата сложения в файл} close(f); { закрываем файл} end.
Сумма чисел = 653
Спасибо! Разобрался с текстовыми файлами наконец-то.