Мова програмування Сі підтримує багато функцій стандартних бібліотек для файлового введення і виведення. Ці функції складають основу заголовного файлу стандартної бібліотеки мови Сі <stdio.h>.
Файл відкривається за допомогою fopen, яка повертає інформацію потоку введення-виведення, прикріпленого до вказаного файлу або іншого пристрою, з якого йде читання (або у який триває запис). У разі невдачі функція повертає нульовий покажчик.
Класичний підхід, прийнятий в Сі, полягає в тому, що інформація про потік заноситься в структуру FILE, яка визначена у файлі stdio.h. Файл відкривається за допомогою функції fopen, яка повертає покажчик на структуру типу FILE.
Схожа функція freopen бібліотеки Сі виконує аналогічну операцію після першого закриття будь-якого відкритого потоку, пов'язаного з її параметрами.
FILE *fopen(const char *path, const char *mode);
Функція відкриває файл із заданим ім'ям і зв'язує з ним потік. Аргумент mode вказує режим відкриття файла.
Табл. 2. Значення аргументу mode функції fopen()
"r" | відкриття файлу без дозволу на модифікацію, файл відкривається лише для читання. |
"w" | створення нового файлу тільки для запису, якщо файл із вказаним ім'ям вже існує, то він перезапишеться. |
"a" | відкриття файлу тільки для додавання інформації в кінець файлу, якщо файл не існує, він створюється. |
"r+" | відкриття існуючого файлу для читання та запису. |
"w+" | створення нового файлу для читання та запису, якщо файл із вказаним ім'ям вже існує, то він перезаписується. |
"a+" | відкриває файл у режимі читання та запису для додавання нової інформації у кінець файлу; якщо файл не існує, він створюється. |
З текстового файла можна читати інформацію по рядках, по символах або за форматом.
Записування символу в файловий потік здійснюється функцією putc().
int putc(int ch, FILE *f);
Читання рядка здійснюється за допомогою функції fgets().
char *fgets(char *s,int n,FILE *stream);
У виклику функції fgets(): s - покажчик на буфер, в який читається рядок, n - кількість символів. Читання символу в рядок проходить або до появи символу кінця рядка "\n", або читається n-1 символ. В кінці прочитаного рядка записується нульовий символ.
Функція feof() перевіряє, чи не прочитаний символ завершення файла. Якщо такий символ прочитаний, то feof() повертає ненульове значення і цикл завершується.
Читання з текстового файлу форматованих даних може здійснюватися функцією fscanf(). Синтаксис:
int fscanf(FILE *stream, const char *format[, address, …]);
Параметр format визначає рядок форматування аргументів, які задаються своїми адресами.
При форматованому читанні можуть виникати помилки у зв'язку з досягненням завершення файлу або невірним форматом записаних у файлі даних. Перевірити, чи успішно пройшло читання даних можна за значенням, яке повертає функція fscanf(). При успішному читанні вона повертає кількість прочитаних полів.
Для запису даних у текстовий файл найчастіше використовуються функції fgetc(), fputs() та fprintf().
Функція fgetc() використовується для читання чергового символу з потоку, відкритого функцією fopen().
int fgetc(FILE *f);
Синтаксис функції fprintf():
int fprintf(FILE *stream, const char *format[,argument,…]);
Вона працює майже мак само, як і функція printf(), але їй потрібний додатковий аргумент для посилання на файл. Він є першим у списку аргументів.
Після закінчення роботи з файлом, його необхідно закрити за допомогою функції fclose().