Работа с файлами Паскаля - Расширенная работа с текстовыми файлами
Кроме работы со строками в текстовых файлах, Паскаль поддерживает и более расширенные методы, можно оперировать и данными в строке. Можно читать данные из строки в одну или более переменных. Паскаль сам обеспечивает разбор строки на составляющие части.
F - файловая переменная типа TextFile, это означает, что процедуры Readln и Writeln могут работать с текстовыми файлами и не применимы для других типов файлов. Если эта переменная опущена, то в качестве текстового файла используется консоль, это также означает, что вывод возможен на консоль и не применим для GUI приложений. На самом деле эта конструкция равносильна следующему вызову Readln(Writeln(Output). Просто это значение по умолчанию и компилятор сам подставляет эти файловые переменные, который уже описаны в модуле System. Если создано консольное приложение, то Дельфи автоматически ассоциирует эти файловые переменные с окном консоли приложения.
Vn – это одна или несколько переменных строкового, символьного, целочисленного или плавающего типа и также логические переменные. Возможно это не полный список типов, но можете попробовать проверить сами. Не поддержанные типа можно выводить с помощью функций преобразования в строку, например DateTimeToStr(Now).
Pn – это один или более параметров процедуры, которые могут являться строкой, символом, целым числом или числом с плавающей запятой. В справке по процедуре Write ошибочно указано, что в качестве параметров могут использоваться только переменные, на самом деле это могут быть как переменные, так и константные выражения.
Кроме того, справка полностью умалчивает о формате вывода данных в файл, о возможности форматирования данных непосредственно в параметрах процедуры. Форматирования вывода осуществляется в следующем виде X <:Width <:Decimals>>, где Width общая длина вывода, а Decimals это количество знаков после десятичной точки. Для получения нужной длины вывода слева добавляется нужное количество пробелов, если результат не помещается в указанную длину, то тогда длина увеличивается до должного количества знаков.
Спецификатор Decimals применим только к числам с плавающей запятой. При этом при необходимости производится округление числа. Если спецификаторы не указаны, то для вывода используется научный формат, то есть #.##############E+####
Для целочисленных чисел, строк и символов, без указания длины используется столько символов, что бы значение полностью вывелось.
Значения выводятся без разделителей между ними, поэтому надо или использовать длину на один символ больше нужной или вставлять в список параметров пробел, например так
Writeln(F, A,' ',B,' ',C);
Теперь по поводу чтения обратно в переменные. Все аналогично выводу, за исключением одного неприятного отличия. В случае указания в списке переменных, переменной строкового типа, в нее считывает все до окончания строки. Вроде в старом Паскале такого не было, там вроде бы считывалось слово до первого разделителя, но так ли это было уже не помню, но это и не важно, важно знать как это работает сейчас и учитывать это при чтении данных. Поэтому если надо считывать элементы строки в переменные, то можно использовать только один элемент и он должен быть последним в строке. Приведу пример неправильной логики.
Ну и на последок напишем простой пример чтения и записи двухмерного массива в файл.
var
Column: Integer;
F: TextFile;
IntArray: array<1..10, 1..3> of Integer;
Row: Integer;
S: string;
TmpInt: Integer;
begin
// Инициализация
for Row := 1 to 10 do
begin
for Column := 1 to 3 do
begin
IntArray := Row*100 + Column;
end;
end;
AssignFile(F, 'Test.txt');
try
Rewrite(F); // открытие для записи
for Row := 1 to 10 do
begin
for Column := 1 to 3 do
begin
Write(F, IntArray:11);
end;
WriteLn(F, ' Строка: ', Row);
end;
finally
CloseFile(F);
end;
// Чтение
try
WriteLn('Test Reading');
Reset(F); // открытие для чтения
for Row := 1 to 10 do
begin
for Column := 1 to 3 do
begin
Read(F, TmpInt);
Write(TmpInt:11);
end;
ReadLn(F, S);
WriteLn(S);
end;
finally
CloseFile(F);
end;
Readln; // Закрытие окна по ENTER
end.
После проверки, можете открыть файл Блокнотом и убедиться, что он действительно текстовый.
Примечание: при выводе текстовых сообщений учтите, что на консоль надо выводить в OEM кодировке, поэтому если надо вывести текст на национальном языке, то предварительно преобразуйте его из ANSI в OEM, см. главу «Текстовые файлы - домашнее задание». То есть, любой текст надо преобразовывать функцией CharToOem. Это же касается и текстовых констант в коде программы.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.