Текстовые файлы

Файлы позволяют сохранять данные между запусками программы и обрабатывать внешнюю информацию.

Текстовый файл хранит данные в виде текста, разбитого на строки. В PascalABC.NET файл можно открыть для чтения, записи или добавления данных, после чего работать с ним через методы файловой переменной.

Открытие файла для чтения

Функция OpenRead открывает текстовый файл для чтения, а метод Close закрывает его после работы.

Пусть файл input.txt содержит:

PascalABC.NET
begin
  var f := OpenRead('input.txt');

  Println(f.ReadlnString);

  f.Close;
end.

Результат:

PascalABC.NET

Чтение данных разных типов

Методы ReadInteger, ReadReal и ReadWord считывают данные из текстового файла сразу в нужном типе.

Пусть файл data.txt содержит:

25 3.14 Pascal
begin
  var f := OpenRead('data.txt');

  var n := f.ReadInteger;
  var x := f.ReadReal;
  var s := f.ReadWord;

  f.Close;

  Println(n, x, s);
end.

Результат:

25 3.14 Pascal

Чтение файла до конца

Свойство Eof позволяет организовать цикл чтения строк до конца файла.

Пусть файл input.txt содержит:

Первая строка
Вторая строка
Третья строка
begin
  var f := OpenRead('input.txt');

  while not f.Eof do
    Println(f.ReadlnString);

  f.Close;
end.

Результат:

Первая строка
Вторая строка
Третья строка

Обработка чисел из файла

Последовательное чтение удобно использовать, когда файл содержит заранее неизвестное количество значений.

Пусть файл numbers.txt содержит:

10 20 5 7 8
begin
  var f := OpenRead('numbers.txt');
  var sum := 0;

  while not f.Eof do
    sum += f.ReadInteger;

  f.Close;

  Println(sum);
end.

Результат:

50

Открытие файла для записи

Функция OpenWrite создаёт новый файл или очищает существующий, а методы Write и Writeln записывают в него данные.

begin
  var f := OpenWrite('output.txt');

  f.Write('PascalABC.NET ');
  f.Writeln(2026);
  f.Writeln('Программирование');

  f.Close;
end.

Содержимое файла output.txt:

PascalABC.NET 2026
Программирование

Запись с разделением пробелами

Методы Print и Println записывают несколько значений, автоматически разделяя их пробелами.

begin
  var f := OpenWrite('students.txt');

  f.Println('Анна', 21, 4.5);
  f.Println('Борис', 19, 4.2);

  f.Close;
end.

Содержимое файла students.txt:

Анна 21 4.5
Борис 19 4.2

Добавление в конец файла

Функция OpenAppend открывает существующий файл для добавления новых данных в его конец.

begin
  var f := OpenWrite('log.txt');
  f.Println('Запуск программы');
  f.Close;

  f := OpenAppend('log.txt');
  f.Println('Завершение программы');
  f.Close;
end.

Содержимое файла log.txt:

Запуск программы
Завершение программы

Имя, переименование и удаление файла

Свойство Name возвращает имя файла, а методы Rename и Erase позволяют переименовать и удалить закрытый файл.

begin
  var f := OpenWrite('old.txt');

  f.Println('Текст');
  Println(f.Name);

  f.Close;

  f.Rename('new.txt');
  f.Erase;
end.

Результат:

old.txt

При переименовании и удалении файлов файловая переменная может быть недоступна. В этом случае лучше воспользоваться внешними процедурами DeleteFile и RenameFile:

  DeleteFile('old.txt')
  RenameFile('new.txt','old.txt');
end.

Кодировка файла

При открытии текстового файла можно явно указать кодировку, например Encoding.UTF8.

begin
  var f := OpenWrite('text.txt', Encoding.UTF8);

  f.Println('Привет, PascalABC.NET!');
  f.Close;

  f := OpenRead('text.txt', Encoding.UTF8);

  Println(f.ReadlnString);
  f.Close;
end.

Результат:

Привет, PascalABC.NET!

Чтение всего файла

Функция ReadAllText читает всё содержимое текстового файла в одну строку и автоматически закрывает файл.

Пусть файл input.txt содержит:

Первая строка
Вторая строка
begin
  var text := ReadAllText('input.txt');

  Print(text);
end.

Результат:

Первая строка
Вторая строка

Запись всего текста

Функция WriteAllText записывает строку в файл, не требуя явно открывать и закрывать его.

begin
  var text := 'Hello, PascalABC.NET!';

  WriteAllText('output.txt', text);
end.

Содержимое файла output.txt:

Hello, PascalABC.NET!

Чтение всех строк в массив

Функция ReadAllLines открывает файл, читает все строки файла и возвращает array of string, затем закрывает файл.

Пусть файл colors.txt содержит:

red
green
blue
begin
  var lines := ReadAllLines('colors.txt');

  lines.Println;
end.

Результат:

red green blue

Запись массива строк

Функция WriteLines ооткрывает файл, записывает в него элементы массива строк — каждый элемент в отдельную строку, затем закрывает файл.

begin
  var lines := ['red', 'green', 'blue'];

  WriteLines('colors.txt', lines);
end.

Содержимое файла colors.txt:

red
green
blue

Чтение строк как последовательности

Функция ReadLines возвращает строки файла как sequence of string - в отличие от ReadAllLines строки не хранятся в памяти одновременно, а считывается сторка за строкой К результату можно применять методы последовательностей.

Пусть файл numbers.txt содержит:

one
two
three
four
begin
  var lines := ReadLines('numbers.txt');

  lines.Where(s -> s.Length > 3).PrintLines;
end.

Результат:

three
four

Запись последовательности строк

Функция WriteLines записывает в файл строки из sequence of string.

begin
  var lines: sequence of string := ['Pascal', 'Python', 'C#'];

  WriteLines('languages.txt', lines);
end.

Содержимое файла languages.txt:

Pascal
Python
C#

Фильтрация строк файла

ReadLines и WriteLines позволяют обработать большой текстовый файл как последовательность, не загружая все его строки в массив.

Пусть файл input.txt содержит:

PascalABC.NET
Python
Pascal
C#
PascalABC.NET и .NET
begin
  var lines := ReadLines('input.txt')
    .Where(s -> 'Pascal' in s);

  WriteLines('output.txt', lines);
end.

Содержимое файла output.txt:

PascalABC.NET
Pascal
PascalABC.NET и .NET

Частоты слов в файле

Текст файла можно разбить на слова и подсчитать количество появлений каждого слова.

Пусть файл words.txt содержит:

one two one three two one
begin
  var text := ReadAllText('words.txt');

  text.ToWords(AllDelimiters)
    .EachCount
    .PrintLines;
end.

Результат:

(one,3)
(two,2)
(three,1)