Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

14. Символы, строки, текстовые файлы

Предыдущий раздел:

Следующий раздел:

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

Чтение и запись текстовых файлов производится теми же процедурами readln и writeln, которые читают и записывают что-то на экране (по сути, Паскаль рассматривает экран как частный случай текстового файла). Чтобы осуществлять ввод из файла и вывод в файл необходимо проделать следующие действия.

1) Описать так называемую файловую переменные типа text.

  var
    f: text;

Если требуется одновременно работать с несколькими файлами, то для каждого необходима своя файловая переменная.

2) Каждую файловую переменную необходимо связать с конкретным файлом на диске с помощью процедуры Assign(<Файловая переменная>, ‘<Имя файла>’). Имя файла это строковая константа (конкретное имя в кавычках) или переменная типа string, содержащая такое имя. Например:

  Assign(f, 'c:\temp\sample.txt');

Если такого файла нет, эта процедура его создаст.

3) Прежде чем что-либо читать из файла, его нужно открыть для чтения. Это делается процедурой Reset(<файловая переменная>). Например:

  reset(f);

4) После этого можно считывать данные из файла с помощью процедуры readln(<файловая переменная>, <переменная>). Например:

  readln(f, s);

Первый после открытия для чтения readln прочитает первую строчку файла и перенесет ее содержимое в переменную s. Повторный вызов readln прочитает вторую строчку и т.д. Существует специальная переменная – файловый указатель, которая хранит номер текущей строки, то есть определяет, какая строка будет считана очередным readln. При вызове Reset он устанавливается равным 0. Каждый вызов readln увеличивает его на 1.

Переменная s может иметь строковый или числовой тип. Однако если это числовая переменная, а в файле находятся нечисловые данные, то возникнет неисправимая логическая ошибка и программа аварийно завершится.

Если в программе стоит readln, а строчки в файле уже закончились, то также произойдет аварийное завершение программы. Чтобы этого избежать существует функция EoF(<Файловая переменная>) (EoF расшифровывается End Of File), которая возвращает логическое значение true, если все строки из файла уже прочитаны, и false если еще есть, что читать.

Пример: Напечатаем содержимое файла sample.txt на экране.

  var
    f: text;
    s: string;
  begin
    {Связываем файловую переменную с конкретным файлом}
    Assign(f, 'sample.txt');
    {Открываем файл для чтения, указатель ставим в 0}
    Reset(f);
    {Повторяем пока указатель не будет указывать на конец файла}
    while not EoF(f) do
    begin
      {Считываем одну строку в s, указатель увеличивается на 1}
      readln(f, s);
      {Печатаем строку s на экране}
      writeln(s);
    end;
    {Открытый для чтения файл следует закрыть}
    Close(f);
  end.

Простого способа узнать, сколько в файле строк не существует. Для этого следует считывать все строки до конца файла, как в предыдущем примере, и при этом увеличивать на 1 какую-нибудь переменную-счетчик.

Простого способа повторно прочитать некоторую строку также нет. Для этого следует снова вызвать Reset, обнулив таким образом указатель, а затем с помощью readln считать все предыдущие строки. Только после этого очередной readln прочитает нужную строку. По этой причине однажды считанные данные следует запоминать, например, в элементах массива.

5) Прежде чем, что-либо записать в файл следует открыть его для записи. Это можно сделать с помощью одной из двух процедур: Rewrite(f) или Append(f). Первая стирает содержимое файла (если оно там было) и устанавливает указатель на 0. Говорят, что файл открывается для перезаписи. Вторая открывает файл для дозаписи. Старое содержимое не стирается, указатель устанавливается в конец файла.

6) После того, как файл открыт для записи, можно добавлять в него новые строчки с помощью процедуры writeln(<файловая переменная>, <число или строка>). Для примера запишем в файл sample.txt числа от 1 до 10.

  var
    f: text;
    i: integer;
  begin
    Assign(f, 'sample.txt');
    Rewrite(f);
    for i:=1 to 10 do
      writeln(f, i);
    Close(f);
  end.

7) Однажды открытый для чтения или записи файл следует закрыть. Это делается процедурой Close(<файловая переменная>). Примеры ее использования уже встречались выше. Закрытие освобождает занятую под процессы чтения/записи память. Если производилась запись, то закрытие гарантирует, что все изменения будут сохранены на диске.

Следующий раздел:

Предыдущий раздел:

7 комментариев

  1. Scarhand

    Блин как я вам благодарен!!!!

  2. Роман

    Подскажите как можно сохранить значения переменных на компьютере, с селью их дальнейшего использования (в последующих запусках программы).

    А также как можно изменить свет текста внутри: wtiteln(‘text’, a, b, c, ‘вот тут например’);

  3. Taras

    >> Подскажите как можно сохранить значения переменных на компьютере, с селью их дальнейшего использования (в последующих запусках программы).

    Да, собственно, сохраняешь их в текстовый файл, а при следующем запуске оттуда читаешь.

    >> А также как можно изменить свет текста внутри: wtiteln(‘text’, a, b, c, ‘вот тут например’);

    Не очень понял вопрос. Если хочешь печатать цветной текст, то можно подключить модуль crt и использовать процедуру textcolor. Как-то так:

    uses
      crt;
    var
      color: integer;  
    begin
      for color:=1 to 15 do
      begin
        textcolor(color);
        writeln('Цветной текст ', color);
      end;  
    end.
    
  4. Роман

    Спасибо. Во 2-ом вопросе я имел ввиду что-то типа:
    writeln(color:’text’);
    Чтобы не писать все время текстколор(4), а внутри врайт изменить несколько слов разными светами.

  5. Taras

    Стандартный writeln так не умеет. Можно сделать свой модуль и создать в нем какой-нибудь writeln2 с параметрами (цвет, выводимое значение).

  6. Роман

    Здравствуйте. У меня имеется очень объемная программа. Я бы хотел её сократить. Это возможно сделать если каждую часть сохранить в текстовый файл, и потом, вставив их в другую программу запускать?

  7. Taras

    Разделить программу на несколько файлов можно. Только делается это с помощью модулей. А то, что здесь — это файлы для хранения данных.

Добавить комментарий