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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторная работа №7
Работа с файловыми потоками в С.
Текстовые файлы.
Цель работы: получить практические навыки решения задач с использованием текстовых файлов на языке С.
Теоретические сведения
Стандартная библиотека С содержит две функции, выполняющие форматированный ввод и вывод стандартных типов данных: printf() и scanf(). Термин форматированный подразумевает, что эти функции могут читать или писать данные в различных форматах, которыми можно управлять. Функция printf() используется для вывода данных на консоль, scanf() для чтения данных с консоли. Как printf(), так и scanf() могут работать с любыми стандартными типами, включая символы, строки и числа.
Функция printf() имеет следующий прототип:
int printf(const char * форматная_строка, …);
Первый аргумент форматная_строка определяет способ вывода последующих аргументов. Он содержит два типа элементов: символы, выводимые на экран, и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. Спецификаторы формата приведены в таблице 1.
Код %c %d %i %e %E %f %g %G %o %s %u %x %X %p %n %% |
Формат Символ Знаковое десятичное целое число Знаковое десятичное целое число Научная нотация (e строчная) Научная нотация (E строчная) Десятичное число с плавающей точкой Использует или %e, или %f, соответствующее более короткому представлению Использует или %E, или %f, соответствующее более короткому представлению Беззнаковое восьмеричное число Строка символов Беззнаковое десятичное число Беззнаковое шестнадцатиричное число (строчные буквы) Беззнаковое шестнадцатиричное число (прописные буквы) Вывод указателя Ассоциированный аргумент это указатель на целое, в которое записывается число уже выведенных символов Выводит знак % |
Функция printf() возвращает число напечатанных символов. В случае ошибки она возвращает EOF.
Стандартный ввод с консоли, как правило, осуществляется с помощью scanf(). Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Стандартный вид scanf() следующий:
int scanf(const char * форматная_строка, …);
форматная_строка определяет способ чтения значений в переменные, на которые указывает список аргументов. Форматная строка состоит из трёх типов символов:
Спецификаторы формата перечислены в таблице 2.
Код %c %d %i %e %f %g %o %s %x %p %n %u %[] |
Значение Читает одиночные символы Читает десятичное число Читает десятичное число Читает число с плавающей запятой Читает число с плавающей запятой Читает число с плавающей запятой Читает восьмеричное число Читает строку Читает шестнадцатиричное число Читает указатель Получает целочисленное значение, равное числу прочитанных символов Читает беззнаковое целое Сканирует множество символов |
В scanf() следует передавать адреса. Это означает, что все аргументы должны быть указателями на переменные. Например, для чтения целого в переменную count надо использовать следующий вызов scanf():
scanf(“%d”, &count);
Файловая система ANSI C
Файловая система ANSI C является частью системы ввода-вывода, позволяющей читать или записывать файлы. Она содержит несколько взаимосвязанных функций. Наиболее типичные показаны в таблице 3
Таблица 3
Имя fopen() fclose() putc() fputc() getc() fgetc() fseek() fprintf() fscanf() feof() ferror() rewind() remove() fflush() |
Функция Открывает файл Закрывает файл Записывает символ в файл Аналогично putc() Читает символ из файла Аналогично getc() Переходит к указанному байту в файле Делает то же в файл, что и printf() на консоль Делает то же с файлом, что и scanf() c консолью Возвращает истину при достижении конца файла Возвращает истину при обнаружении ошибки Сбрасывает индикатор позиции файла на начало файла Стирает файл Очищает буфер файла |
Заголовочный файл stdio.h должен включаться в любую программу, использующую данные функции.
Заголовочный файл stdio.h предоставляет прототипы для функций ввода-вывода и определяет три типа: size_t, fops_t и FILE. Тип size_t это беззнаковое целое, как и fops_t. Тип FILE обсуждается в следующем разделе.
Указатель на файл это указатель на информацию, определяющую различные параметры файла, включая его имя, состояние и текущую позицию. В принципе, указатель на файл идентифицирует конкретный дисковый файл и используется потоком для выполнения операций ввода-вывода. Указатель на файл это переменная-указатель типа FILE. Для создания файловой переменной-указателя используется оператор типа:
FILE *fp;
Функция fopen() открывает для использования поток, связывает файл с данным потоком и затем возвращает указатель FILE на данный поток. Чаще всего файл рассматривается как дисковый файл. Функция fopen() имеет следующий прототип:
FILE *fopen(const char *имя_файла, const char *режим);
где режим указывает на строку, содержащую желаемый режим открытия файла. Некоторые значения режима показаны в таблице 4.
Режим |
Значение |
“r” |
Открывает файл для чтения. (По умолчанию как текстовый файл.) |
“w” |
Создаёт файл для записи. (По умолчанию как текстовый файл.) |
“a” |
Присоединяет к файлу. (По умолчанию как текстовый файл.) |
“rb” |
Открывает двоичный файл для чтения. |
“wb” |
Открывает двоичный файл для записи. |
“ab” |
Присоединяет к двоичному файлу. |
“r+” |
Открывает файл для чтения и записи. (По умолчанию как текстовый файл.) |
“w+” |
Создаёт файл для чтения и записи. (По умолчанию как текстовый файл.) |
“a+” |
Присоединяет или создаёт файл для чтения и записи. (По умолчанию как текстовый файл.) |
Имя_файла должно быть строкой символов, представляющей корректное имя файла операционной системе, и может содержать указание пути.
Функция fopen() возвращает указатель базового типа FILE. Данный указатель идентифицирует файл и используется большинством функций файловой системы. Его никогда не следует изменять самостоятельно. Функция возвращает нулевой указатель, если файл не может быть открыт.
Если необходимо открыть файл с именем test на запись, то следует написать:
fp = fopen(“test”, “w”);
где fp это переменная типа FILE *. Тем не менее обычно можно увидеть следующее:
if((fp = fopen(“test”, “w”))==NULL) {
puts(“Cannot open file.”);
exit(1);
}
Данный метод позволяет обнаружить ошибки при открытии файла, например, наличие защиты от записи или отсутствие свободного места на диске.
Запись символа
Система ввода-вывода ANSI C определяет две эквивалентные функции, выводящие символ putc() и fputc(). Функция putc() используется для записи символов в поток, ранее открытый для записи с помощью функции fopen(). Прототип для putc() следующий:
int putc(int ch, FILE *fp);
где fp указатель на файл, возвращённый fopen(), а ch выводимый символ. По историческим причинам ch определена как int, но используется только младший байт.
Если putc() выполнена успешно, она возвращает выведенный символ. В противном случае возвращает EOF.
Чтение символа
Имеется две эквивалентные функции, предназначенные для ввода символа getc() и fgetc(). Функция getc() используется для чтения символов из потока, открытого на чтение с помощью fopen(). Прототип getc() следующий:
int getc(FILE *fp);
где fp это указатель на файл типа FILE *, возвращённый fopen(). По традиции getc() возвращает целое, но старшие байты установлены в 0.
Функция getc() возвращает EOF при достижении конца файла.
Закрытие файла
Функция fclose() используется для закрытия потока, ранее открытого с помощью fopen(). Она сохраняет в файл данные, находящиеся в дисковом буфере, и выполняет операцию системного уровня по закрытию файла.
Имеет прототип:
int fclose(FILE *fp);
где fp это указатель на файл, возвращённый fopen(). Если возвращён 0, то операция закрытия выполнена успешно, а если EOF, то, значит, была ошибка.
Помимо основных функций ввода-вывода, система буферизированного ввода-вывода содержит fprintf() и fscanf(). Данные функции ведут себя также, как и printf() и scanf(), за тем исключением, что работают с дисковыми файлами. Они имеют следующие прототипы:
int fpintf(FILE *fp, const char * форматная_строка, …);
int fscanf(FILE *fp, const char * форматная_строка, …);
где fp это указатель на файл возвращаемый fopen().
Требования к отчету.
Отчет должен содержать:
Контрольные вопросы:
Лабораторное задание.
Для выполнения лабораторной работы необходимо составить программу согласно своему варианту задания.
Таблица вариантов
Номер варианта |
Задание |
1, 12, 23 |
Дан файл f, компоненты которого являются целыми числами. Записать в файл g, компоненты файла f, исключив повторные вхождения чисел. |
2, 13, 24 |
Дан файл f, компоненты которого являются действительными числами. Найти:
|
3, 14, 25 |
Дан символьный файл f. Подсчитать число вхождений в файл каждой из букв a, b, c, d, e, f. Результат вывести в файл g в виде таблицы с комментариями. |
4, 15, 26 |
Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа исходного файла, в файл h все нечетные. Порядок следования чисел сохраняется. Записать в файл g и h комментарии. |
5, 16, 27 |
Дан текстовый файл, содержащий программу на языке Си. Проверить эту программу на соответствие числа открывающих и закрывающих фигурных скобок. |
6, 17, 28 |
Дан символьный файл f. Найти и записать в файл g самое длинное слово файла f, снабдив его комментарием. |
7, 18 |
Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f:
Записать в файл g комментарий. |
8, 19 |
Дан файл f. Создать два файла, записав в первый из них все четные числа, а во второй все нечетные. |
9, 20 |
Дан файл f. Создать два файла, записав в первый из них среднее геометрическое всех четных чисел, а во второй среднее арифметическое всех нечетных чисел. |
10, 21 |
Дан числовой файл f. Выбрать все значения, которые делятся нацело на 2 и 4, но не делятся на 6. Записать эти значения в файл g, а все остальные в файл h. |
11, 22 |
Дан текстовый файл f. Определить, являются ли первые два символа цифрами и если да, то четно ли это число. Записать его в файл g, если оно четно и в h ,если оно нечетно. |
6