Лабораторная работа № 1-16 Ввод-вывод в C с использованием файлов

advertisement
-1Информатика
Лабораторная работа 1-16
Лабораторная работа № 1-16
Ввод-вывод в C с использованием файлов
1. ЦЕЛЬ РАБОТЫ
Целью работы является разработка, отладка и выполнение программы на C с
использованием операций ввода-вывода в файлы.
2. СОСТАВ РАБОЧЕГО МЕСТА
2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).
2.2. Программное обеспечение: операционная система Windows, интегрированная
оболочка Dev C ++.
3. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
3.1. Ввод и вывод в C
Язык C рассматривает файл как последовательность байтов, каждый из которых
может быть прочитан индивидуально. Это отвечает структуре файла в среде Unix, откуда
происходит язык C.
Функции ввода и вывода в стандартной библиотеке C позволяют читать данные из
файлов или получать их с устройств ввода и записывать данные в файлы или выводить их
на различные устройства.
В C имеются два класса функций ввода-вывода: функции ввода-вывода верхнего
уровня и функции ввода-вывода нижнего уровня.
При использовании функций ввода-вывода верхнего уровня обмен
информацией между файлами и между файлами и внешними устройствами
осуществляется с помощью специальных областей в оперативной памяти (буферов).
Буферизация ввода-вывода выполняется автоматически. Она позволяет ускорить
выполнение программы за счет уменьшения количества обращений к сравнительно
медленно работающим внешним устройствам.
Для пользователя файл, открытый на верхнем уровне, представляется как
последовательность считываемых или записываемых байтов. Эта последовательность
считываемых или записываемых байтов называют потоком (stream).
Когда поток открывается для ввода-вывода, он связывается со структурой типа
FILE (имя типа FILE определяется с помощью оператора typedef в разделе stdio.h
стандартной библиотеки C) с помощью указателя. Этот указатель используется для всех
операций с данным файлом (открытия, чтения, записи и закрытия).
Функции ввода-вывода верхнего уровня дают возможность обрабатывать как
форматированные, так и неформатированные данные.
Функции ввода-вывода верхнего уровня одинаково реализуются в различных
операционных системах и на разных компьютерных платформах, т.е. с их помощью
можно писать переносимые программы.
Все функции ввода-вывода верхнего уровня описаны в разделе stdio.h.
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-2Информатика
Лабораторная работа 1-16
Функции ввода-вывода нижнего уровня не выполняют буферизацию и
форматирование данных, но они позволяют непосредственно пользоваться средствами
ввода-вывода операционной системы.
При работе с файлом на нижнем уровне с ним связывается дескриптор (handle).
Дескриптор является целым значением, характеризующим размещение информации об
открытом файле во внутренних таблицах системы.
Функции нижнего уровня из стандартной библиотеки целесообразно использовать
при разработке своей собственной подсистемы ввода-вывода.
Функции ввода-вывода нижнего уровня переносимы в рамках некоторых систем
программирования C, в частности относящихся к операционной системе Unix.
Описания функций нижнего уровня содержатся в разделе io.h стандартной
библиотеки C.
Стандарт ANSI C поддерживает только стандартный пакет ввода/вывода, так как
нет возможности представления всех операционных систем одной моделью низкоуровневого ввода/вывода.
В данной дисциплине рассматриваются только библиотечные функции верхнего
уровня.
3.2. Открытие файлов
Когда программа начинает выполняться, автоматически открываются следующие
пять потоков:
 стандартный ввод (stdin);
 стандартный вывод (stdout);
 стандартный вывод для сообщений об ошибках (stderr);
 стандартный последовательный порт (stdaux);
 стандартное устройство печати (stdprn).
Рассмотренные ранее функции scanf(), getchar() и gets() работают с
stdin, а printf(), putchar() и puts() – с stdout.
По умолчанию stdin связывается с клавиатурой, а stdout и stderr – с
дисплеем, однако для переопределения стандартного ввода-вывода программы можно
использовать символы перенаправления из командного языка MS DOS или
рассматриваемую ниже функцию freopen().
Следует отметить, что имена stdin, stdout и stderr в C также являются
указателями на переменные типа FILE и их можно использовать как идентификаторы
файла в приведенных ниже функциях ввода-вывода. Кроме того, в stdio.h определена
константа EOF, численное значение которой равно -1. Эта константа возвращается
некоторыми функциями ввода, когда достигается конец файла.
Остальные файлы программы должны быть открыты для ввода и вывода. Открытие
файлов выполняется с помощью функции fopen(). Закрытие уже открытого файла и
переназначение потока на другой файл осуществляется с помощью функции freopen().
Функции fopen() и freopen() имеют следующие описания:
FILE *fopen(char *имя-файла, char * тип)
FILE *freopen(char * имя-файла, char * тип,
FILE *имя-старого-файла)
где
имя-файла – строковая константа или переменная, задающая имя файла (с
указанием пути, если это необходимо).
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-3Информатика
Лабораторная работа 1-16
тип – строковая константа или переменная, определяющая способ доступа к
файлу. Параметр тип может иметь следующие значения:
Значение
типа
Действие
"r"
Открыть текстовый файл для чтения (файл должен существовать).
"w"
Открыть пустой текстовый файл для записи; если файл существует,
его содержимое теряется.
"a"
Открыть текстовый файл для записи в конец файла (добавление);
файл создается, если он не существует.
"r+"
Открыть для чтения и записи (файл должен существовать).
"w+"
Открыть пустой текстовый файл для чтения и записи; если файл
существует, его содержимое теряется.
"a+"
Открыть текстовый файл для обновления (чтения и записи), добавив
запись к концу существующего файла или создать новый файл в
случае его отсутствия; чтение возможно для всего файла, а запись
возможна только в конец файла.
"rb", "wb",
"ab", "ab+",
"a+b", "wb+",
"w+b"
Эти режимы действуют так же, как предыдущие, только вместо
текстового доступа к файлу используется двоичный доступ.
имя-старого-файла – указатель
на закрываемый файл, поток с которого
переназначается на файл, определенный в имени-файла.
После того как программа успешно откроет файл, функции fopen() и
freopen() возвращают идентификатор файла – указатель на переменную типа FILE,
который могут использовать другие функции ввода/вывода, чтобы ссылаться на этот файл.
В случае, если произошла ошибка при открытии или переназначении файла, функции
возвращают значение NULL.
3.3. Ввод/вывод форматированных данных в файлы и
строки
Помимо рассмотренных ранее функций в разделе stdio.h стандартной
библиотеке C реализованы также следующие функции ввода и вывода форматированных
данных:
 fprintf() – форматированная запись данных в файл;
 sprintf() – форматированная запись данных в строку;
 fscanf() – форматированное чтение данных из файла;
 sscanf() – форматированное чтение данных из строки;
Функции форматированного ввода и вывода fprintf(), sprintf(), fscanf()
и sscanf() определяются следующим образом:
int fprintf(FILE * идентификатор-файла,
char *строка-формата[, аргумент-1,...])
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-4Информатика
Лабораторная работа 1-16
int sprintf(char * строка, char *строка-формата[,аргумент-1,...])
int fscanf (FILE * идентификатор-файла,
char * строка-формата[, аргумент-1,...])
int sscanf(char * строка, char * строка-формата[,аргумент-1,...])
где
*идентификатор-файла – указатель на файл (переменную типа FILE), в который
записываются или из которого считываются данные.
* строка – строка, в которую записываются или из которой считываются данные.
строка-формата – строка формата (для fprintf() и sprintf() определяется
аналогично printf(), а для fscanf() и sscanf() – аналогично scanf()).
аргумент-1,... – выводимые выражения (для fprintf() и sprintf()) или
адреса вводимых переменных (для fscanf() и sscanf()).
Возвращаемое значение: для fprintf() и sprintf() – количество выведенных
символов, а для fscanf() и sscanf() – количество
успешно введенных,
преобразованных и присвоенных элементов ввода или EOF – по достижении конца файла
или конца строки.
Функции sscanf() и sprintf() выполняют те же действия, что и функции
fscanf() и fprintf(), но вводимые данные берутся из строки, а выводимые данные
помещаются в строку.
3.4. Функция закрытия файлов
После окончания работы с файлом его необходимо закрыть. При этом указатель на
переменную типа FILE, связанный с данным файлом, освобождается и его можно
использовать для других целей.
Функция fclose() закрывает указанный файл. Все буфера, связанные с потоками
(как системные, так и пользовательские) при закрытии файла автоматически
освобождаются. Функция имеет следующее определение:
int fclose (FILE * идентификатор-файла)
где
идентификатор-файла – указатель
на закрываемый
файл (переменную типа
FILE).
Возвращаемое значение: функция fclose() возвращает значение 0, если файл
успешно закрыт или значение EOF, если произошла ошибка.
3.5. Файловый ввод/вывод символов и строк
Помимо рассмотренных ранее функций вывода символов и строк в стандартный
поток stdout, в разделе stdio.h стандартной библиотеки C реализованы также
следующие функции вывода символов и строк в файлы:
 fputc() – запись символа в файл;
 putc() – запись символа в файл (версия макро);
 fputs() – запись строки в файл;
 ungetc() – возврат символа в файл.
Для ввода символов и строк из файла можно использовать следующие функции:
 fgetc() – чтение символа из файла;
 getc() – чтение символа из файла (версия макро);
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-5Информатика
Лабораторная работа 1-16
 fgets() – чтение строки из файла;
Функции fputc(), putc(), ungetc(), fgetc() и getc() записывают символ
в файл или читают символ из файла и определяются следующим образом:
int fputc (int символ, FILE * идентификатор-файла)
int putc (int символ, FILE * идентификатор-файла)
int ungetc (int символ, FILE * идентификатор-файла)
int fgetc (FILE * идентификатор-файла)
int getc (FILE * идентификатор-файла)
где
символ – символ, записываемый в выводной поток.
* идентификатор-файла – указатель на файл (переменную типа FILE), в
который записывается или из которого считывается символ.
Возвращаемое значение – записанный или считанный символ или EOF, если либо
произошла ошибка, либо встретился конец файла, либо (для ungetc()) попытка
записать символ оказалась неудачной.
Функции getc() и fgetc(), работают почти так же, как функция getchar(), а
функции putc() и fputc() – почти так же, как функция putchar(). Разница состоит
в том, что этим функциям необходимо указать, какой файл использовать.
Функция ungetc() помещает символ, задаваемый первым аргументом, назад во
входной поток. После этого при следующем вызове функции ввода этот символ будет
прочитан. Стандарт ANSI C гарантирует только одну вставку символа за один раз.
Функции fputs() и fgets() записывают строку в файл или читают строку из
файла и определяются следующим образом:
int fputs (const char *строка, FILE * идентификатор-файла)
char *fgetc (char * строка, int максимальная-длина,
FILE * идентификатор-файла)
где
* строка – указатель на вводимую или выводимую строку.
максимальная-длина – максимальная длина вводимой строки.
* идентификатор-файла – указатель на файл (переменную типа FILE), в который
записывается или из которого считывается строка.
Функция fgets() читает информацию ввода до первого символа перевода строки
или пока прочитано меньше символов, чем задано в максимальной-длине минус один
символ или же пока не достигнут конец файла; затем функция fgets() добавляет
конечный символ "\0", чтобы сформировать строку. Если fgets() читает целую строку
до того, как достигнута максимальная-длина, она добавляет символ перевода строки в
конце строки, как раз перед нулевым символом. В этом она отличается от gets(),
которая читает символ перевода строки, но опускает его.
Функция fgets() возвращает значение NULL в случае, если она читает символ
конца файла. Это можно использовать, чтобы проверить, достигнут ли конец файла.
Иначе она возвращает переданный ей адрес.
Функция fputs() имеет два аргумента: сначала адрес строки, затем файловый
указатель. Она записывает строку, найденную по указателю, в файл. В отличие от
puts(), функция fputs() не добавляет символ новой строки при выводе. Так же, как и
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-6Информатика
Лабораторная работа 1-16
функция puts(), функция fputs() при успешном выводе возвращает неотрицательное
число, а при ошибке возвращает значение EOF.
4. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Порядок выполнения работы:
1. Выполнить операции ввода-вывода с использованием файлов по одному из
вариантов, приведенных в следующей таблице. Исходные файлы создаются с помощью
любого текстового редактора. Если строка исходного или выводного файла содержит
несколько данных, они отделяются друг от друга пробелами. Данные из выводного файла
распечатать в виде таблицы.
№
варианта
1.
2.
3.
4.
5.
6.
7.
8.
Операции, выполняемые в
программе
Создать из двух исходных файлов,
выводной файл, содержащий оба вида
данных.
Добавить данные в конец исходного
файла. Добавляемые данные вводятся с
клавиатуры. Признаком окончания
ввода является символ "0".
Разбить данные из исходного файла в
два выводных файла.
Добавить данные из одного файла в
конец другого файла.
Данные из исходного файла
отсортировать по первым буквам и
записать в выводной файл.
В исходный файл, содержащий
отсортированные данные, добавить
новые данные, введенные с клавиатуры
(введенные данные должны быть
размещены в порядке возрастания
первой буквы) и поместить данные в
выводной файл. Признаком окончания
ввода служит символ "0".
Удалить строки из исходного файла и
поместить полученные данные в
выводной файл. Фамилии для
удаляемых строк вводятся с
клавиатуры. Признаком окончания
ввода служит символ "0";
Изменить строки в исходном файле и
поместить данные в выводной файл.
Фамилии для изменяемых строк
вводятся с клавиатуры. Если строка
найдена, выдается запрос на новое
значение зарплаты. Признаком
окончания ввода служит символ "*".
Содержимое строки
вводимого файла/файлов
Содержимое строки
выводимого файла/файлов
Файл 1. Фамилия
Файл 2. Год рождения
Фамилия и год рождения.
Номер телефона
Номер телефона
Фамилия и год рождения
Файл 1. Фамилия
Файл 2. Год рождения
Фамилия и год рождения
Файл 1. Фамилия и
год рождения
Файл 2. Фамилия и год
рождения
Фамилия
Фамилия
Фамилия
Фамилия
Фамилия и зарплата
Фамилия и зарплата
Фамилия и зарплата
Фамилия и зарплата
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
-7Информатика
Лабораторная работа 1-16
№
варианта
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Операции, выполняемые в
программе
Удалить строки исходного файла и
поместить данные в выводной файл.
Данные для удаления содержаться в
файле.
Слить данные двух исходных файлов и
поместить данные в выводной файл.
Данные для изменения содержаться в
файле.
В исходный файл, содержащий
отсортированные данные, добавить
новые данные, содержащиеся в файле
добавлений (введенные данные должны
быть размещены в порядке возрастания
первой буквы) и поместить данные в
выводной файл.
Найти данные в исходном файле.
Фамилии для поиска вводятся с
клавиатуры. Признаком окончания
ввода служит символ "*".
Найти данные в исходном файле.
Данные для поиска (фамилии)
содержатся в файле поиска.
Найти данные, соответствующие
заданному критерию, в исходном файле.
Критерием поиска является
превышение заданного значения
зарплаты. Предельное значение
вводится с клавиатуры
Найти данные, соответствующие
заданному критерию, в исходном файле.
Критерием поиска служит первая буква
фамилии, вводимая с клавиатуры.
Найти данные, соответствующие
заданному критерию, в исходном файле.
Критерием поиска является
превышение заданного возраста.
Текущий год и возраст вводятся с
клавиатуры (месяц рождения не
учитывается).
Найти данные, соответствующие
заданному критерию, в исходном файле.
Критерием поиска является наличие
телефона.
Сформировать новый файл из исходных
файлов.
Модифицировать строки исходного
файла и разместить полученные данные
в выводном файле. С клавиатуры
вводится текущий год (месяц рождения
не учитывается);
Содержимое строки
вводимого файла/файлов
Содержимое строки
выводимого файла/файлов
Файл 1. Фамилия и зарплата
Файл 2. Удаляемая фамилия
Фамилия и зарплата
Файл 1. Фамилия и зарплата
Файл 2. Фамилия и зарплата
Фамилия и зарплата
Файл 1. Фамилия
Файл 2. Фамилия
Фамилия
Фамилия и зарплата
----
Файл 1. Фамилия и зарплата
Файл 2. Фамилия
----
Фамилия и зарплата
-----
Фамилия и зарплата
-----
Фамилия и год рождения
-----
Фамилия и номер телефона или
“-“, если нет телефона
-----
Файл 1. Фамилия и год
рождения
Файл 2. Фамилия и зарплата
Фамилия и возраст
Фамилия, год рождения и зарплата
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Фамилия и год рождения
Автор: Шонин В.А.
-8Информатика
Лабораторная работа 1-16
№
варианта
20.
21.
22.
23.
24.
25.
26.
27.
Операции, выполняемые в
программе
Модифицировать строки исходного
файла и разместить полученные данные
в выводном файле. С клавиатуры
вводится год рождения для каждой
фамилии.
Модифицировать строки исходного
файла и разместить полученные данные
в выводном файле. С клавиатуры
вводится стаж работы на данном
предприятии для каждой строки файла.
Поиск слов в словаре. С клавиатуры
вводится английское слово. Признаком
окончания ввода является символ "*".
Проверить файл на наличие заданной
последовательности символов. С
клавиатуры вводятся искомые
последовательности символов.
Признаком окончания ввода является
символ "*".
Удалить заданные последовательности
символов из файла и разместить
полученные данные в выводном файле.
С клавиатуры вводятся искомые
последовательности символов.
Признаком окончания ввода является
символ "*".
Заменить заданные последовательности
символов в файле и разместить
полученные данные в выводном файле.
С клавиатуры вводятся искомые
последовательности символов и
последовательности замены. Признаком
окончания ввода является символ "*".
Модифицировать строки исходного
файла и разместить полученные данные
в выводном файле. Ввести табельный
номер (1<= номер <=число-строк) в
соответствии с датой поступления на
работу (чем раньше поступил, тем
меньше номер). Если даты совпадают больший номер у того, кто стоит в
списке позже.
Найти данные, соответствующие
заданному критерию, в исходном файле.
Критерием поиска является
превышение заданного возраста.
Текущая дата и возраст вводятся с
клавиатуры
Содержимое строки
вводимого файла/файлов
Содержимое строки
выводимого файла/файлов
Фамилия и зарплата
Фамилия, год рождения и зарплата.
фамилия, год рождения и
зарплата
Фамилия, стаж работы и зарплата
английское слово и
соответствующее ему русское
слово
произвольный текст
-----
Произвольный текст
Измененный текст
Произвольный текст
Измененный текст
Фамилия и дата
поступления на работу - в виде
ДД.ММ.ГГ, где ДД, ММ и ГГ две цифры, обозначающие
соответственно день, номер
месяца и год
табельный номер, фамилия и дата
поступления
фамилия и дата рождения - в
виде ДД.ММ.ГГ, где ДД, ММ и
ГГ -две цифры, обозначающие
соответственно день, номер
месяца и год
----
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
----
Автор: Шонин В.А.
-9Информатика
Лабораторная работа 1-16
№
варианта
28.
29.
30.
31.
32.
33.
34.
35.
Операции, выполняемые в
программе
Содержимое строки
вводимого файла/файлов
Содержимое строки
выводимого файла/файлов
Модифицировать строки исходного
файла и разместить полученные данные
в выводном файле. Для каждой
фамилии добавить инициалы (в ту же
символьную переменную, что и
фамилия).
Определить количество символов в
словах, содержащихся в строках
исходного файла и вывести результат
на дисплей. При подсчете
учитываются только символы в словах
исходного файла (символы-разделители
не учитываются).
Определить количество одинаковых
слов, содержащихся в строках
исходного файла и вывести результат
на дисплей
(максимальное число слов в файле –
50).
Фамилия и зарплата
Фамилия (с инициалами) и
зарплата
Слова, разделенные одним из
следующих символовразделителей:
" .,:; ".
----
Слова, разделенные одним из
следующих символовразделителей:
" .,:; ".
----
Преобразовать данные, содержащихся
в строках исходного файла в
табличную форму и вывести результат
на дисплей.
Количество слов в строках
файла должно быть
одинаковым;
В качестве символа-разделителя
между словами использовать
символ ":".
Слова, разделенные одним из
следующих символовразделителей:
" .,:; ".
----
Слова, разделенные одним из
следующих символовразделителей:
" .,:; ".
----
Преобразовать исходный файл в
выводной файл следующего вида:
первая строка выводного файла
содержит первые слова строк исходного
файла, вторая строка – вторые слова
строк исходного файла и т.д. Вывести
получившийся выводной файл на
дисплей.
Найти заданные слова и частоту их
повторения в строках исходного файла
и вывести результат на дисплей
(максимальное число слов в файле –
50).
Преобразовать строки исходного файла
так, чтобы каждое предложение было
выведено на отдельной строке
Вывести список слов – правильных
идентификаторов языка C среди слов,
содержащихся в строках файла.
Предложения, разделенные
одним из следующих символовразделителей:
".?!".
Слова, разделенные одним из
следующих символовразделителей:
" .,:; ".
Преобразованный файл
Преобразованный файл
----
2. Введите программу с клавиатуры в среде Dev C ++.
3. Выполните отладку программы и запустите ее на выполнение. Протестируйте
программу для ошибочных и правильных значений исходных данных.
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
- 10 Информатика
Лабораторная работа 1-16
4. Покажите преподавателю программу и результаты ее работы (при ошибочных и
правильных значениях исходных данных) и скопируйте текст программы и результаты
работы программы в окно текстового редактора Блокнот с заголовками "Текст
программы имя-программы" и "Результат работы программы имя-программы".
5. Скопируйте полученный в окне текстового редактора Блокнот документ на
свою дискету или флэш-карту.
5. СОДЕРЖАНИЕ ОТЧЕТА
В отчете должно быть представлено содержимое созданного вами документа.
6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Каковы отличия функций ввода-вывода верхнего уровня от функций вводавывода нижнего уровня?
2. Как определяются файлы в языке C?
3. Какие файлы автоматически открываются в начале выполнения программы?
4. Для каких целей используются функции открытия файлов?
5. Какие режимы можно задать при открытии файла в C?
6. Какие функции
выполняют форматированную запись в файл
и
форматированное чтение из файла?
7. Каковы различия между функциями printf(), fprintf() и sprintf()?
8. Для каких целей используются функции закрытия файлов?
9. Какие функции используются для ввода-вывода символов и строк в файлы?
10. Чем отличается реализация функций fputc() и fgets() от реализации
функций puts() и gets()?
Файл: 446991519 Создан: 05.12.1998 Модифицирован: 18.01.2016
Автор: Шонин В.А.
Download