Федеральное агентство по образованию
Федеральное государственное образовательное учреждение
высшего профессионального образования
«Южный федеральный университет»
,
Работа с текстовыми файлами в языке Паскаль
Методические указания
к решению задач по курсу «Информатика»
для студентов 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 |


