Відкриття і закриття потоку
Схема роботи з потоком така ж, як і з файлом: відкрити потік, виконати читання і/або запис, закрити потік.
Відкриває потік функція
FILE* fopen(
constchar *filename,// ім'я файла, що асоціюється з потоком
constchar *mode // рядок режимів роботи з потоком
) – повертає покажчик на потік, який ідентифікує його в подальших операціях.
У рядку режимів можуть знаходитися наступні символи:
r – відкрити тільки для читання;
w – створити для запису. Існуючий файл буде перекритий новим;
а – відкрити для дозапису, або створити для запису, якщо файл не існує;
+ – операції виконуватимуться з уже існуючим файлом;
t – текстовий режим (обробка символів CR-LF);
b – двійковий режим (ніякої обробки).
За відсутності в рядку b або t режим визначається глобальній змінній _fmode, визначеній у заголовному файлі fcntl.h.
FILE – це структура для потоку, що управляє, оголошена в stdio.h. Вона не призначена для прямого використання.
Потік є програмною надбудовою над файлом, що надає програмісту додатковий сервіс. Крім сумісного відкриття потоку і файла (fopen), можна відкрити потік і асоціювати його з уже відкритим файлом (fdopen), відкрити файл і асоціювати його з уже відкритим потоком (freopen).
Закриває потік і вивантажує буфери функція
intfclose(FILE *stream ) – повертає 0 при успіху і EOF – при помилці.
EOF – константа, визначена в stdio.h.
intfcloseall(void) – закриває всі відкриті потоки, окрім стандартних: stdin, stdout, stdprn, stderr і stdaux.
Введення і виведення символів
Читання символу з потоку виконується функцією
intfgetc(FILE *stream) – повертає код символу. При помилці повертає EOF. Запис символу в потік виконується функцією
intfputc(intз, FILE *stream) – повертає код символу з. При помилці повертає EOF.
Читання символу зі стандартного потоку stdin виконується функцією intfgetchar(void);.
Запис символу в стандартний потік stdout виконується функцією intfputchar(int з);.
Завдання. Скопіювати файл xxx.bin у файл yyy.bin.
Рішення.
#include<stdio.h>
voidmain() { FILE *in = fopen ("noname00.cpp","rt");
FILE *out = fopen ("noname00.000","wt");
if (!in) return;
while (!feof(in))
fputc(fgetc(in), out);
fcloseall(); }
Введення і виведення рядків
Читання рядка з потоку виконується функцією
char *fgets(
char *s, // покажчик на буфер, що приймає рядок
int n, // гранична кількість читаних символів (звичайно розмір буфера)
FILE *stream )
Вона повертає покажчик на буфер або NULL при помилці.
Читання припиняється, коли досягнутий кінець рядка або прочитано n-1 символів з файла. Рядок у буфері замикається нульовим символом. Покажчик файла переміщається за символи CR-LF.
Запис рядка в потік виконується функцією
char*fputs(
char*s, // покажчик на рядок
FILE *stream )
Вона повертає покажчик на останній записаний символ або EOF при помилці.
Термінальний символ рядка не копіюється. Символи CR-LF додаються у файл.
Завдання. Скопіювати текстовий файл xxx.txt у файл yyy.txt за рядками.
Рішення.
#include<stdio.h>
voidmain() { constint n = 100;
charbuf [n];
FILE *in = fopen (noname00. cpp,r);
FILE *out = fopen (noname00. 000,w);
if (!in) return;
while (!feof(in)) { fgets(buf, n, in);
fputs(buf, out);
}
fcloseall(); }
