- •1 Задание
- •2 Требования к реализации
- •3 Методические указания
- •3.1 Файловые потоки ввода-вывода
- •1) Открытие потока
- •2) Закрытие потока
- •3) Ввод/вывод в поток
- •4) Функции позиционирования
- •3.2 Работа со строками
- •Функции работы со строками
- •1) Определение длины строк
- •2) Обращение строк
- •3) Поиск символов
- •3) Поиск подстрок
- •2) Копирование строк
2) Закрытие потока
Поток закрывается либо при завершении программы, либо явным образом с помощью функции fclose:
fclose(указатель на поток);
Перед закрытием потока информация из связанных с ним буферов выгружается на диск. Рекомендуется всегда явным образом закрывать потоки, открытые для записи, чтобы избежать потери данных.
3) Ввод/вывод в поток
Ввод/вывод в поток можно осуществлять различными способами:
- в виде последовательности байтов,
-в виде символов и строк
или с использованием форматных преобразований.
Ввод/вывод в поток осуществляется с помощью функции библиотеки stdio.h. Для каждого вида операций определен свой набор функций.
Функции ввода/вывода в текстовые файлы
Чтение символа из потока — getc, fgetc.
int getc(FILE *f);
int fgetc(FILE *f);
Функции возвращают очередной символ в форме int из потока f. Если символ не может быть прочитан, то возвращается значение EOF.
Запись символа в поток — putc, fputc.
int putc(int ch, FILE *f);
int fputc(int ch, FILE *f);
Функции записывают символ ch в поток f. При ошибке возвращается значение EOF, иначе — записанный символ.
Чтение строки из потока — fgets.
char *fgets(char *s, int n, FILE *f);
Функция читает не более n-1 байт из потока f в строку s, прекращая чтение при обнаружении символа новой строки или конца файла. Символ новой строки при чтении не отбрасывается, а помещается в конец строки. Прочитанная строка дополняется ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращается NULL. При успешном завершении чтения функция возвращает указатель на строку s.
Запись строки в поток — fputs.
int fputs(const char *s, FILE *f);
Функция записывает строку символов s в поток f. Символ конца строки в файл не записывается. При ошибке возвращает значение EOF, иначе — неотрицательное число.
Форматированный ввод из потока — fscanf.
Функция fscanf ( ) имеет следующий прототип:
int fscanf(FILE *f,const char *format[, address, ...]);
Она во всем аналогична функции scanf ( ), за исключением того, что форматированный ввод осуществляется не со стандартного устройства ввода, а из файлового потока f.
Форматированный вывод в поток — fprintf,
Функция fprintf ( ) имеет следующий прототип:
int fprintf(FILE *f, const char *format[, argument,...])
Она во всем аналогична функции printf (), но осуществляет форматированный вывод не на стандартное устройство вывода, а в файловый поток f.
Функция feof ( )
Функция feof ( ) является на самом деле макросом и позволяет осуществлять проверку на достижение символа конца файла при операциях ввода-вывода. Она имеет следующий прототип:
int feof(FILE *f);
Она возвращает ненулевое значение, если был обнаружен конец файла при последней операции ввода в поток f и 0, если конец файла еще не достигнут.
Рассмотрим пример файлового ввода и вывода:
#include <stdio.h>
int main ()
{
FILE *in, *out;
if ((in = fopen("d:\\1\\1.txt", "rt")) == NULL)
{
fprintf(stderr, "Cannot open input file.\n");
return 1;
}
if ((out = fopen("d:\\1\\2.txt", "wt")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
while (!feof(in))
fputc(fgetc(in), out);
fclose(in);
fclose(out);
fprintf(stderr, "The file is copied successfully.\n");
return 0;
}