Відкриття файлу для введення-виведення через потік виконує функція fopen().
#include<stdio.h>
FILE* fopen( const char *filename, const char *mode )
Поповертає покажчик на змінну типу FILE, що описує відкритий потік
файлового введення-виведення. Якщо неможливо відкрити файл, функція поповертає
NULL-покажчик. Змінна filename - покажчик на ASCIIZ-рядок символів, що задає
специфікацію відкритого файлу. Якщо незадана літера накопичувача,
використовується накопичувач за замовчанням. Якщо не заданий абсолютний
маршрут, в якості початкового директорію використовується поточний робочий
директорій вибраного накопичувача. Змінна mode ‑ покажчик на ASCIIZ-рядок
символів, що задає режим відкриття файлу яка утворюється комбінацією символів,
наведених нижче. (Табл.
6)
Табл. 6. Символи завдання режиму відкриття потоку введення-виведення
r |
Файл відкривається тільки для читання. Так може бути відкритий лише
вже існуючий файл. Якщо файл з заданою специфікацією не існує, fopen()
повертає NULL. При успішному відкритті покажчик запису-читання файлу
встановлюється в 0 |
w |
Файл відкривається тільки для запису з усіченням. Якщо файл не існує,
він створюється в заданому параметром Filename директорії. Створений файл має
атрибут архівного файлу. Якщо створити файл не вдається, функція поповертає
NULL. Якщо файл існує, але має атрибут “лише для читання",
поповертається NULL. При успішному відкритті покажчик запису-читання файлу
встановлюється в 0. По цій причині можлива заміна вмісту існуючого файлу,
якщо перед доступом до файлу не виконується примусова установка покажчика.
Якщо весь попередній вміст необхідно зберегти, можна або відразу після
відкриття виконати “перемотку” покажчика на кінець файлу, або відкрити файл в
режимі поповнення вмісту - режимі “а”. Спроба читання з файлу завершується
поверненням помилки функцією читання. Після закриття файл має завжди “новий”
розмір, відповідний поточному положенню покажчика запису-читання. Тому
відкриття існуючого файлу і його негайне закриття відсікає файл до нульової
довжини |
a |
Файл відкривається для поповнення. Все теж саме, що й для режиму
"w", але після відкриття файлу покажчик запису-читання
встановлюється на позицію кінця файлу. В результаті запис в файл відбувається
з збереженням попереднього вмісту |
r+ |
Файл відкривається для поновлення. Він доступний для читання і
запису, але після закриття не відбувається відсічення файлу: розмір файлу
залишається колишнім, якщо поточний покажчик запису-читання файлу знаходиться
“ліворуч” колишнього положення EOF. Відразу після відкриття файлу покажчик
встановлюється на початок файлу |
w+ |
Файл відкривається для поновлення. Він доступний для читання і
запису, після закриття існуючий файл відсікається. Якщо файл, що
відкривається не існує, він створюється в директорії, що задається
специфікацією файлу. Відразу після відкриття файлу покажчик запису-читання
файлу встановлюється на початок файлу |
a+ |
Файл відкривається для поновлення. Він доступний для читання і
запису, але після закриття не відбувається відсічення файлу. Відразу після
відкриття файлу покажчик запису-читання встановлюється на позицію EOF |
b |
Файл відкривається в бінарному режимі. Задається після г, w, а, г+,
w+, а+, наприклад "а+b". Для підвищення мобільності програмного
коду краще використати управління бінарним або текстовим режимом через змінну
_fmode, бо реалізації Сі для інших ОС можуть і не містити параметрів b або t
при відкритті файлу |
t |
Файл відкривається в текстовому режимі. Задається після r, w, а, r+,
w+, а+, наприклад "rt" |
В зв’язку з тим, що операція відкриття файлу може завершитися невдало, при відкритті файлу обов’язково проводиться аналіз значення, що повертається функцією fopen(). Загально прийнятою є наступна схема побудови програми при відкритті файлу:
#include <stdio.h>
FILE *ptr;
main( ) {
...
if( ( ptr = fopen( “file.txt”, “r” )
!= NULL)
/* Дії програми у випадку, якщо
файл file.fxt, розміщений в поточному директорії, успішно відкритий тільки для
читання */
else
/* Дії програми у випадку, невдалої
спроби відкриття файлу */
Обробка помилки відкриття файлу може бути самою різноманітною. Додаткова інформація про причину помилки відкриття доступна Сі-програмі через функцію perror(). Функція strerror() дасть можливість отримати покажчик на текстовий рядок повідомлення про помилку. Відзначимо, що для того, щоб інформація про помилку була “свіжою”, необхідно виконати “скидання” умови помилки функцією clearerr().
Після завершення всіх операцій файлового доступу, файл слід закрити. При закритті файлу, відкритого як потік, руйнується внутрішня змінна по шаблону FILE, вміст буферу переноситься на диск і виконується DOS-функція закриття файлу. При цьому відбувається поновлення елементу директорія, відповідного файлу, ‑ записується новий розмір файлу (якщо відбувся приріст файлу або файл відсікався), нові дата і час. Закриття файлів після того, як вони більше не використовуються в програмі, обов’язкова операція для Сі-програми. Це необхідно тому, що MS-DOS накладає достатньо жорсткі обмеження на число одночасно відкритих файлів.
Закриття файлу виконує функція стандартної бібліотеки fclose().
#include <stdio.h>
int fclose( FILE *fp )
Закриває потік введення-виведення, на що вказує fp. У випадку успіху
повертає 0, у протилежному випадку повертає EOF.
![]() |
![]() |
![]() |