Текстовые файлы хранят информацию в виде последовательности символов. Символы составляют строки произвольной длины. В конце каждой строки находятся два особых символы: #13#10, отделяющие строку от строки (проще говоря Enter). Текстовые файлы широко распространены. Для участия в олимпиадах по программированию умение работать с файлами обязательно.
Представим cитуацию, что данные для программы находятся в файле data.txt. Мы указываем компютеру: читай(из data.txt, число А)…. Затем выполнив десятки действий с числом А, снова указываем компютеру, читай(из data.txt, число В). Но ведь если потом изменить имя файла, придется по всему программному коду искать, «Где же это мы читаем их файла data.txt».
Что бы избежать таких проблем в Паскаль ввели понятие файловой переменной. Это свого рода синоним (аватар) имени файла. Мы привязываем реальный файл к его синониму один раз вначале программы. Если имя файла изменилось, то мы изменяем программный код один раз, всего лишь поменяв имя файла. А наш синоним автоматически подставит правильное имя файла во всех последуюих обращениях.
В программе на Паскале текстовый файл представляет файловая переменная типа TEXT. Файловой переменной (внутри программы) сопоставляют имя файла (на компьютере) с помощью оператора Assign (файловая изменение, имя файла), где имя файла — строка, содержащая дисковое имя файла.
Сопоставление файловой переменной F_in файла что находится по адресу ‘c:\data.txt’
Assign (F_in,'c:\data.txt');
Сопоставление файловой переменной F_out файла что находится в той же папке что и программа разработчика’
Assign(F_out,'resalt.txt');
Теперь файл необходимо открыть. Текстовый файл открывается операторами:
для чтения - ReSet (файловая переменная); Reset (F_in); для записи - ReWrite (файловая переменная); Rewrite(F_out);
В файл, открытый для записи можно только писать, из файла, открытого для чтения, можно только читать. Если необходимо прочитать из файла, открытого для записи, его сначала надо закрыть оператором Сlose (файловая переменная), Close (F_in); Close (F_out); а затем снова открыть уже для чтения.
Чтение из файла выполняется хорошо знакомым нам оператором READ. Если перед списком ввода в операторе READ стоит файловая переменная, он считывает данные не с клавиатуры, а из файла.
Текстовый файл оператора READ такое же источник символов, как и клавиатура, только эти символы следуют друг за другом не во времени, а в пространстве файла. Во времени можно перемещаться только в одну сторону, по файлу — тоже. Движение предполагается последовательное, от начала до конца, поэтому текстовые файлы называют последовательными.
Чтобы понять, что прочитает из файла тот или иной оператор READ, введем понятие указателя файла. Фактически указатель — это номер очередного символа файла, но лучше представить его в виде стрелки, направленной в определенную точку файла.
Сразу после открытия стрелка указывает на первый символ файла. Чтение очередной порции данных всегда выполняется, начиная с символа, на который показывает стрелка. После чтения стрелка автоматически передвигается вперед на длину участка, читается. Так продолжается, пока стрелка не достигнет конца файла.
Дополнительный оператор чтения READLN вводит все, предусмотренное списком ввода и продвигает указатель до начала новой строки.
Чтение из текстового файла с выводом на экран.
Запись в текстовый файл выполняется оператором WRITE, в котором перед списком записи стоит файловая переменная. Выведена информация присоединяется к тому, что была выведена в файл с момента его открытия. Желая создать новый файл, его открывают оператором REWRITE. Открытие существующего файла оператором REWRITE приведет к потере того, что находилось там раньше. Закончив запись в файл, вы должны его закрыть. Только после закрытия новый файл будет окончательно сформирован.
Дополнительный оператор записи WRITELN выводит все, предусмотренное списком вывода и также символы #13#10.
Важно: если в имени файла не указывается путь к файлу на жестком диске, подразумевается что файл лежит в текущей папке где находится программа, которая с ним работает. Аналогично, файлы результата выкладываются в эту же папку.
Var F_in, F_out: Text; A, B, C: Integer; BEGIN Assign(f_in,'data.txt'); Assign(F_out,'Resalt.txt'); Reset(f_in); Rewtite(F_out); Read (a, b, c); {ввод с клавиатуры} Read (f, a, b, c); {считывание файла} Write(a,b,c); Write(F_out,a,b,c); Close(F_in); Close(F_out); End.
Рассмотрим пример работы с файлами используя сайт www.e-olimp.com.ua
Задача: Дано двухцифровое число А. Вывести его цифры через пробел.
1 способ решения (Клавиатура)
var a:integer; BEGIN read(a); writeln(a div 10,' ',a mod 10); END.
2 способ решения (Работа с файлами) При использовании текстовых файлов ввода и вывода файл ввода должен иметь имя «input.txt», файл вывода «output.txt»
var a:integer; f_in,f_out:text; BEGIN assign(f_in,'input.txt'); assign(f_out,'output.txt'); reset(f_in); rewrite(f_out); read(f_in,a); writeln(f_out,a div 10,' ',a mod 10); close(f_in); close(f_out); END.
Прошу отметить, что перед окончанием программы отсутствует команда Readln. (Внутренняя среда тестирования сайта настроена именно таким образом, поэтому перед тем, как решать задачи — ознакомитесь со справочной информацией)
А также результат записывается с переводом курсора на новую строку по окончании вывода результата. (Writeln(f_out,a) либо Write(f_out,a); Writeln(F_out);)