Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Lab7 / ЯП_лаб_7.doc
Скачиваний:
2
Добавлен:
18.02.2023
Размер:
223.23 Кб
Скачать

Лабораторная работа № 7

Тема: Программирование с использованием файлового ввода и вывода

Цель: Изучить библиотечные функции для работы с файлами. Освоить основные методы обработки файлов.

Краткая теория

Файл – именованная область данных, на каком либо носителе информации (жесткий диск, гибкий диск и т.д. и т.п.). В языке С файлы подразделяются на два вида:

  • бинарные файлы – содержат структурированную или не структурированную двоичную информацию;

  • текстовые файлы – содержат структурированную или не структурированную информацию в текстовом виде (ASCII символы).

Для работы с файлами в языке С используются функции файлового (потокового) ввода и вывода описанные в библиотеке stdio.h. Переменная для работы с файлами описывается как указатель на структуру FILE:

FILE *file = NULL;

Весь процесс обработки файла заключается в выполнении следующих действий:

  1. открытие файла;

  2. ввод и вывод в файл;

  3. закрытие файла.

Функция открытия файла:

FILE * fopen(const char *filename, const char *mode);

Первый параметр filename – имя файла, который необходимо открыть. Имя файла может быть указано в виде:

  • только имя файла – если файл находится в текущем рабочем каталоге программы;

  • абсолютный (полный) путь к файлу;

  • относительный путь к файлу.

Второй параметр mode – режим открытия файла (строка). Перечень возможных режимов открытия файлов в языке С приведен в таблице. Функция возвращает указатель на файловую переменную, если удалось открыть указанный файл в заданном режиме. В противном случае (если файл открыть не удалось) функция возвращает значение NULL.

Таблица – Режимы открытия файла

Значение

Описание

“r”

Открывает существующий текстовый файл для чтения

“w”

Создает текстовый файл или создает заново (удаляет и снова создает) существующий текстовый файл для записи

“a”

Создает текстовый файл или открывает сущетвующий текстовый файл для записи. Запись осуществляется в конец файла.

“rb”

Открывает существующий бинарный файл для чтения

“wb”

Создает бинарный файл или создает заново (удаляет и снова создает) существующий бинарный файл для записи

“ab”

Создает бинарный файл или открывает сущетвующий бинарный файл для записи. Запись осуществляется в конец файла.

“r+”

Открывает существующий текстовый файл для чтения и для записи

“w+”

Создает текстовый файл или создает заново (удаляет и снова создает) существующий текстовый файл для чтения и для записи

“a+”

Создает текстовый файл или открывает сущетвующий текстовый файл для чтения и для записи. Запись осуществляется в конец файла.

“rb+”

Открывает существующий бинарный файл для чтения и для записи

“wb+”

Создает бинарный файл или создает заново (удаляет и снова создает) существующий бинарный файл для чтения и для записи

“ab+”

Создает бинарный файл или открывает сущетвующий бинарный файл для чтения и для записи. Запись осуществляется в конец файла.

“r+b”

То же, что и “rb+”

“w+b”

То же, что и “wb+”

“a+b”

То же, что и “ab+”

Функция закрытия файла:

int fclose(FILE *stream);

В качестве параметра stream передается указатель на открытый ранее файловый поток. Функция осуществляет закрытие файла и возвращает значение ноль, если закрытие успешно и значение EOF (end of file, целочисленное значение: -1) – если нет.

Функция проверки достижения конца файла:

int feof(FILE *stream);

В параметре stream передается указатель на файловый поток. Функция возвращает не нулевое значение, если достигнут конец файла и нулевое значение – если нет.

Функция форматированного ввода из текстового файла:

int fscanf(FILE * restrict stream,

const char * restrict format,

[address] ...);

В первом параметре stream передается указатель на файловый поток, из которого необходимо произвести чтение. Остальные параметры функции аналогичны параметрам функции scanf. Функция возвращает количество успешно считанных и расположенных значений. В случае возникновения ошибки или достижения конца файла функция возвращает значение EOF.

Функция форматированного вывода в текстовый файл:

int fprintf(FILE * restrict stream,

const char * restrict format,

[argument] ...);

В первом параметре stream передается указатель на файловый поток, в который необходимо вывести значения. Остальные параметры функции аналогичны параметрам функции printf. Функция возвращает количество выведенных символов в поток. В случае возникновения ошибки – отрицательное значение.

Функция чтения строки из текстового файла:

char * fgets(char * restrict buffer, int maxlen,

FILE * restrict stream);

В первом параметре buffer передается указатель на буфер ввода (куда должна быть записана строка). Во втором параметре maxlen передается максимальное количество символов для считывания. В третьем параметре stream передается указатель на файловый поток, из которого необходимо произвести чтение. Функция осуществляет считывание строки в переменную buffer из потока stream до первого символа перевода строки (\n) или до конца файла. Если длина строки превышает указанное во втором параметре значение, то строка усекается. Символ перевода строки, если он присутствует, дописывается в конец считанной строки. Функция возвращает значение buffer или значение NULL, если произошла ошибка или была попытка чтения из конца файла.

Функция записи строки в текстовый файл:

int fputs(const char * restrict string,

FILE * restrict stream);

В первом параметре string передается строка, которую необходимо записать в файл. Во втором параметре stream передается указатель на файловый поток, в который необходимо вывести строку. Функция возвращает положительное значение при успешном выполнении, и значение EOF – при ошибке.

Функция чтения символа из текстового файла:

int fgetc(FILE *stream);

В параметре stream передается указатель на файловый поток, из которого необходимо прочитать символ. Функция возвращает код считанного символа (положительное значение) или значение EOF – если произошла ошибка или была произведена попытка чтения из конца файла.

Функция записи символа в текстовый файл:

int fputc(int c, FILE *stream);

В первом параметре c передается код символа, который необходимо записать в файл. Во втором параметре stream передается указатель на файловый поток, в который осуществляется запись символа. Функция возвращает код записанного символа, или EOF, если произошла ошибка.

Функция чтения данных из бинарного файла:

size_t fread(void * restrict buffer, size_t size,

size_t num, FILE * restrict stream);

В первом параметре функции buffer передается указатель на буфер, куда должны быть записаны считанные из файла данные. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для считывания. Фактический объем данных, которые должны быть считаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, из которого необходимо производить чтение данных. Функция считывает из файлового потока stream num значений, каждое из которых имеет размер size. Считанные значения располагаются последовательно в буфере buffer. Функция возвращает количество успешно считанных значений, которое может быть меньше чем num, если произошла ошибка или был достигнут конец файла.

Функция записи данных в бинарный файл:

size_t fwrite(const void * restrict buffer,

size_t size, size_t num,

FILE * restrict stream);

В первом параметре функции buffer передается указатель на буфер, откуда должны быть записаны данные в файл. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для записи. Фактический объем данных, которые должны быть записаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, в который необходимо производить запись данных. Функция записывает из буфера buffer в файловый поток stream num значений, каждое из которых имеет размер size. Функция возвращает количество успешно записанных значений, которое может быть меньше чем num, если произошла ошибка.

Функция перехода к началу файла:

void rewind(FILE *stream);

В параметре stream передается указатель на файловую переменную, к началу файла которой необходимо перейти. Функция устанавливает текущую позицию в файле на начало файла.

Функция установки позиции в файле:

int fseek(FILE *stream, long int offset, int origin);

Первый параметр stream – указатель на файловую переменную, позицию, в файле которой, необходимо изменить. Второй параметр offset – смещение (в байтах), на которое необходимо установить позицию в файле. Третий параметр origin – указывает, откуда отсчитывать смещение:

  • SEEK_SET (целочисленный код – 0) – от начала файла;

  • SEEK_CUR (целочисленный код – 1) – от текущей позиции в файле;

  • SEEK_END (целочисленный код – 2) – от конца файла.

Функция получения текущей позиции в файле:

long int ftell(FILE *stream);

В параметре stream передается указатель на файловую переменную, позицию в файле которой, необходимо получить. Функция возвращает текущее смещение в файле (в байтах) от начала файла. Если произошла ошибка, то значение -1.

Также в библиотеке stdio.h реализованы две функции для работы с файлами на «верхнем» уровне (не используя файловый поток).

Функция удаление файла:

int remove(const char *filename);

В параметре filename указывается имя существующего файла, который необходимо удалить. Функция возвращает нулевое значение, если файл был успешно удален, в противном случае – значение -1.

Функция переименования файла:

int rename(const char *filename, const char *newname);

Первый параметр filename – имя существующего файла (или директории), который необходимо переименовать. Второй параметр newname – новое имя файла (или директории), файл с данным именем не должен существовать. Функция возвращает нулевое значение, если файл был успешно переименован, в противном случае – значение -1.

Соседние файлы в папке Lab7