Текстовые файлы
В прикладных программах, как правило, имеется большое число входных и выходных данных, причем часто возникает необходимость передачи данных из одной программы в другую. Поэтому данные хранятся в файлах и при необходимости считываются, а также записываются в файлы операторами программы. Напомним, что файлом называется именованная область внешней памяти ЭВМ, содержащая различные данные. Доступ к данным в файле может быть прямым или последовательным в зависимости от типа файла. Рассмотрим работу с данными текстовых файлов.
Текстовые файлы представляют совокупность строк переменной длины с последовательным доступом к данным, т. е. данные записываются на диск и считываются только последовательно.
а) Информация в текстовых файлах хранится в символьном (ASCII коды) виде. При записи чисел происходит их автоматическое преобразование в символьный тип, а при их считывании наоборот автоматически преобразуются в ASCII коды.
б) Строки текстового файла заканчиваются символом #13- Enter и #10- возврат каретки, вводятся оба при нажатии на клавиатуре клавиши Enter (признак EOLn – End Of Line).
с) Признаком конца файла является код #26 (управляющий символ Ctrl+Z, если файл вводится с клавиатуры) записываемый в его конец (признак EOF – End Of File). При записи в файл данные записываются подряд, а управляющие символы устанавливаются автоматически оператором Writeln. Управляющие символы работают при просмотре/редактировании файла на экране или при печати, но при этом, как правило, не показываются.
Запись информации и считывание ее из текстового файла происходит с помощью процедур ввода и вывода Writeln (или Write) и Readln (или Read) через файловую переменную.
1. Файловая переменная "F" описывается в разделе переменных Var f:Text;
2. Файловая переменная "F" связывается с именем файла на диске, процедурой:
Assign(F, 'Имя_файла');
Например: Assign(F, 'file. dat'); связывает с переменную "F" с файлом "file. dat", если файл находится в текущем каталоге, а в противном случае перед его именем указывают маршрут (префикс): 'C:\Pascal\Work\file.dat'. Связывание файловой переменной "F" с именем файла на диске означает обращение к этому файлу при каждом использовании переменной в файловых процедурах.
3. Файл открывается:
а) для записи данных процедурой – ReWrite(F);
На диске создается новый файл. Имя файла указано в процедуре Assign(F,‘Имя_файла’);. Процедурой Write(F,y1,y2,…); или Writeln(F,y1,y2,…); из указанных переменных данные записываются в файл. Процедура Writeln(F,y1,y2,…); дополнительно устанавливает в конце выводимых данных управляющие символы: #13, #10. Здесь обозначено y1,y2,… - список переменных. Повторное применение процедуры стирает содержимое файла и устанавливает указатель на начало файла.
б) для считывания данных процедурой – Reset(F);
При первом обращении к файлу внутренний указатель устанавливается на начало файла, и данные считываются с начала файла процедурой Read(F, y1,y2,…); или Readln(f, y1,y2,…); (при каждом обращении к файлу указатель увеличивается на единицу). Процедура Readln(f, y1,y2,…); после считывания данных в указанные переменные переводит указатель за управляющие символы: #13, #10, игнорируя возможно оставшиеся в строке данные. Следовательно, процедура Readln(F); пропускает все данные записанные до управляющих символов #13, #10. Повторное применение оператора Reset(F); снова устанавливает указатель на начало файла для считывания данных, содержимое файла при этом не меняется.
Конец файла можно определить с помощью функции EOF(F), которая возвращает TRUE, если внутренний указатель файла переменной F достиг метки “конец файла” (иначе FULSE).
с) для добавления данных в конец файла процедурой – Append(F);
На диске должен существовать файл с именем, указанным в операторе Assign(F,’Имя_файла’);.
4. После вывода данных в файл его необходимо закрыть процедурой:
Close(F);
Записывает метку “конец файла” (EOF – End Of File). Если программа не закроет, по какой либо причине файл, то возможна потеря данных.
!!! Если в процедурах ввода/вывода не указывается переменная "F" то происходит вывод данных на экран или их считывание с клавиатуры с отображением на экране.
При работе с числовыми данными необходимо учитывать, что числа в текстовом файле должны отделяться друг от друга хотя бы одним пробелом.
Программа ниже выводит в текстовый файл File1.dat пары значений чисел вводимых с клавиатуры. Ввод пары нулевых значений завершает программу.
Program Wwod;
var
a,b:Real;
F1:Text; { файловя переменная F1 для работы с текстовым файлом}
Begin
Assign(F1,'File1.dat'); { назначить переменой F1, имя файла: File1.dat }
ReWrite(F1); { открыть файл File1.dat для записи }
Writeln(‘Введите построчно a и b’); { вывести первую строчку на экран}
Writeln(F1,' A, B'); { вывести первую строчку в файл}
repeat
readln(a, b); { считать с клавиатуры элементы a и b }
If (a<>0)and(b<>0) then writeln(F1,a:6:2,’ ‘,b:8:3);{записать пару элементов в файл}
until (a=0) and (b=0); ); {закончить цикл при вводе a=0 и b=0}
Close (F1); { закрыть файл File1.dat }
Writeln(‘Файл записан’)
End.
Следующий пример программы читает из предыдущего текстового файла пары чисел, складывает их (условная обработка) и затем все снова записывает в текстовый файл “File2.dat”.
Program Obrabotka_I_Zapis;
Const C1=100;
var
X,Y,Z: Real;{ }
F1, F2:Text; { файловые переменные F1 и F2 для работы с текстовыми файлами}
S:String;
Begin
Assign(F1,'File1.dat'); { назначить переменой F1, имя файла: File1.dat }
Assign(F2,'File2.dat'); { назначить переменой F2, имя файла: File2.dat }
Rewrite(F2); { открыть файл File2.dat для записи }
Reset(F1); { открыть файл File1.dat для чтения }
Readln(F1,S); { прочитать первую строку в файле File1.dat }
S :=S + ’ Z’; { добавить в строку ‘ Z’ }
Writeln(S); { вывод строку на экран }
Writeln(F2,S); { вывод строку в файл File2.dat }
While not (EOF(F1)) =True do { выполнять пока не достигнем конца файла File1.dat }
begin
readln(F1, X, Y);{ считать данные из файла File1.dat }
Z:= X+Y; {пример расчета нового значения }
writeln(X:6:2,’ ‘,Y:8:3,’ ‘, Z:8:3);{ вывести данные на экран }
writeln(F2,X:6:2,’ ‘,Y:8:3,’ ‘,Z:8:3);{ записать данные в файл File2.dat }
end;
Close (F2); { закрыть файл File2.dat }
Close (F1); { закрыть файл File1.dat }