Федеральное агентство по образованию

Федеральное государственное образовательное учреждение

высшего профессионального образования

«Южный федеральный университет»

,

Работа с текстовыми файлами в языке Паскаль

Методические указания

к решению задач по курсу «Информатика»

для студентов 1 курса дневного и вечернего отделений факультета математики, механики и компьютерных наук

Ростов-на-Дону

2008

Методические указания разработаны кандидатом физико-математических наук, ассистентом кафедры прикладной математики и программирования Д. В. Дубровым и старшим преподавателем кафедры прикладной математики и программирования А. А. Чекулаевой.

Печатается в соответствии с решением кафедры прикладной математики и программирования факультета математики, механики и компьютерных наук ЮФУ, протокол № 9 от 2 октября 2008 г.

Оглавление

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

1.1 Посимвольная обработка текстовых файлов. 5

1.2 Построчная обработка текстовых файлов. 10

1.3 Изменение содержимого текстовых файлов. 19

1.4 Ввод/вывод числовой информации в текстовые файлы.. 23

2 Задачи. 27

3 Индивидуадьные задания. 29

3.1 Задание 1. 29

3.2 Задание 2. 35

Литература. 42

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

Текстовые файлы предназначены для хранения текстовой информации — последовательности символьных строк разной длины. Как и в случае с типизированными файлами, с точки зрения операционной системы текстовые файлы ничем не отличаются от остальных; интерпретация содержимого того или иного файла как текстового (или типизированного) является целиком ответственностью прикладной программы, работающей с данным файлом.

НЕ нашли? Не то? Что вы ищете?

Обычно (но не всегда) текстовые файлы имеют расширение “txt”, и для их создания и редактирования используют программы — текстовые редакторы. В качестве другого примера тестовых файлов можно привести файлы с расширением “pas” с исходными текстами программ на Паскале.

С точки зрения программы на Паскале, текстовый файл — это последовательность символов, разделяемых на строки специальным символом «перевод строки». Например, файл, содержимое которого в текстовом редакторе выглядит следующим образом:

ABC

DE FG

H

будет храниться в виде последовательности:

ABC┘DE FG┘┘H

Здесь “┘” означает символ перевода строки (в текстовом редакторе он добавляется при нажатии клавиши “Enter”).

Программа на Паскале имеет доступ к двум специальным переменным типа «текстовый файл»: Input и Output. Чтение данных из первой эквивалентно считыванию с клавиатуры, запись во вторую — выводу на экран. Таким образом, например, вывод на экран надписи можно осуществить как при помощи оператора

WriteLn(′Text′);

так и

WriteLn(Output, ′Text′);

2.1  Посимвольная обработка текстовых файлов

Обычно осуществляется при помощи двух вложенных циклов: наружный проходит по всем строкам в файле, а внутренний — по всем символам в текущей строке.

Пример 1. Вывести содержимое текстового файла на экран (с сохранением разбиения на строки).

Входные данные:

SFileName — имя текстового файла;

Текст программы:

{

Вывод на экран содержимого текстового файла

}

program s_1_1;

var

SFileName: string;

FText: Text;

C: Char;

begin

Write('Имя файла: ');

ReadLn(SFileName); { Ввод имени файла }

{ Открытие файла на чтение }

Assign(FText, SFileName);

Reset(FText);

{ Вывод содержимого файла }

while not EOF(FText) do { пока не достигнут конец файла }

begin

while not EOLn(FText) do { пока не конец строки }

begin

Read(FText, C); { чтение очередного символа }

Write(C) { печать символа }

end; { while not EOLn(FText) }

ReadLn(FText); { пропуск символа перевода строки }

WriteLn { перевод строки на экране }

end; { while not EOF(FText) }

Close(FText) { Закрытие файла }

end.

Замечание: Необходимо особо обратить внимание на то, что в правильно составленной программе оператор

Read(FText, C);

никогда не прочитает в переменную С символ перевода строки.

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

Входные данные:

SInFileName — имя входного текстового файла;

SOutFileName — имя выходного текстового файла;

Текст программы:

{

Копирование содержимого одного текстового файла

в другой без пустых строк

}

program s_2_1;

var

SInFileName, SOutFileName: string;

FIn, FOut: Text;

C: Char;

BIsEmpty: Boolean;

begin

{ Ввод имён файлов }

Write('Имя входного файла: ');

ReadLn(SInFileName);

Write('Имя выходного файла: ');

ReadLn(SOutFileName);

{ Открытие файлов на чтение и запись }

Assign(FIn, SInFileName);

Reset(FIn);

Assign(FOut, SOutFileName);

Rewrite(FOut);

{ Копирование содержимого файла }

while not EOF(FIn) do { пока не достигнут конец файла }

begin

BIsEmpty := True; { предположение, что строка пустая }

while not EOLn(FIn) do { пока не конец строки }

begin

Read(FIn, C); { чтение очередного символа }

Write(FOut, C); { вывод символа в выходной файл }

BIsEmpty := False { если попали внутрь цикла, }

{ значит текущая строка не пустая }

end; { while not EOLn(FIn) }

ReadLn(FIn); { пропуск в файле перевода строки }

if not BIsEmpty then { если строка была не пустой, то }

WriteLn(FOut) { перевод строки в выходном файле }

end; { while not EOF(FIn) }

{ Закрытие файлов }

Close(FIn);

Close(FOut)

end.

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

Входные данные:

SInFileName — имя входного текстового файла;

SOutFileName — имя выходного текстового файла;

N — количество строк в конце входного файла, которые не нужно копировать в выходной.

Для решения задачи необходимо дважды прочесть содержимое входного файла. Первый проход необходим для того, чтобы узнать общее количество строк в файле (NLines). При втором проходе нужно скопировать в выходной файл известное на данный момент количество строк с начала входного файла (NLines - N). Необходимо предусмотреть случай, когда во входном файле окажется меньше строк, чем N.

Текст программы:

{

Копирование содержимое одного текстового файла

в другой без n последних строк

}

program s_3_1;

var

SInFileName, SOutFileName: string;

FIn, FOut: Text;

C: Char;

I, N, NLines: Integer;

begin

{ Ввод данных }

Write('Имя входного файла: ');

ReadLn(SInFileName);

Write('Имя выходного файла: ');

ReadLn(SOutFileName);

Write('Количество строк для пропуска: ');

ReadLn(N);

{ Открытие входного файла на чтение }

Assign(FIn, SInFileName);

Reset(FIn);

{ 1. Определение количества строк во входном файле }

NLines := 0;

while not EOF(FIn) do

begin

NLines := NLines + 1;

ReadLn(FIn); { пропуск символов до конца текущей }

{ строки, включая перевод строки }

end; { while not EOF(FIn) }

{ Открытие выходного файла на запись }

Assign(FOut, SOutFileName);

Rewrite(FOut);

{ 2. Копирование (NLines - N) строк в выходной файл }

Reset(FIn); { вновь возврат на начало FIn }

for I := 1 to NLines - N do

begin

while not EOLn(FIn) do

begin

Read(FIn, C); { чтение очередного символа в строке }

Write(FOut, C) { вывод символа в выходной файл }

end; { while not EOLn(FIn) }

ReadLn(FIn); { пропуск в файле перевода строки }

WriteLn(FOut) { перевод строки в выходном файле }

end; { for I := 1 to NLines - N }

{ Закрытие файлов }

Close(FIn);

Close(FOut)

end.

Упражнения

1) Почему в примерах 1–3 были использованы циклы “while”, а не “repeat... until”?

2) Программы из примеров 1–3 будут всегда добавлять в конец выходного файла (в конце печати на экран в примере 1) символ перевода строки, даже если в конце входного файла его не было. Как можно исправить это поведение (чтобы в конец выходного файла добавлялся символ перевода строки только в том случае, когда он есть в конце соответствующей строки входного файла)?

3) Почему программа s_3_1 будет работать корректно для случая, когда количество пропускаемых строк во входном файле (N), задаваемое пользователем, будет больше общего количества строк в нём?

4) Что произойдёт, если пользователь, запустив программу s_3_1, введёт в N нулевое значение? Отрицательное?

2.2  Построчная обработка текстовых файлов

В отличие от посимвольной обработки, осуществляется считыванием из входного файла (записью в выходной файл) строки целиком за одно считывание (запись) — в переменную (из переменной) типа string.

Пример 4. Вывести содержимое текстового файла на экран (с сохранением разбиения на строки).

Входные данные:

SFileName — имя текстового файла;

Текст программы:

{

Вывод на экран содержимого текстового файла,

построчная обработка

}

program s_1_2;

var

SFileName, S: string;

FText: Text;

begin

{ Ввод имени файла }

Write('Имя файла: ');

ReadLn(SFileName);

{ Открытие файла на чтение }

Assign(FText, SFileName);

Reset(FText);

{ Вывод содержимого файла }

while not EOF(FText) do { пока не достигнут конец файла }

begin

ReadLn(FText, S); { чтение строки, пропуск перевода }

WriteLn(S) { печать строки и перевода строки }

end; { while not EOF(FText) }

{ Закрытие файла }

Close(FText)

end.

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5