Transcript efi_Lec_8_Відкриття файлу в мові С
Файли в мові С
Файлом
називають окрему поіменовану область на одному з пристроїв зовнішньої пам'яті, яка містить однорідну інформацію. Роботою з файлом керує операційна система. Основні дії з файлом – вибір чергового елементу (
читання
) або занесення чергового елементу у файл (
запис
). Доступ до елементів (компонент) файлу здійснюється послідовно, тому для системи важливо знати, яка саме операція виконується з файлом, який саме компонент файлу є черговим (за цим слідкує так звана стрілка файлу, яка вказує на черговий компонент), чи не вичерпані компоненти файлу при читанні (тобто досягнутий кінець файлу), чи були якісь помилки при роботі з файлом, тощо. Вся ця інформація зберігається у структурі, і для того, щоб її створити та ініціалізувати, відбувається операція
відкриття файлу
. Кількість одночасно відкритих файлів в системі достатньо велика, але обмежена, тому файли, з якими робота завершена, треба
закрити
– знищити відповідну структуру з інформацією про файл.
Для відкриття файлу використовується стандартна функція:
FILE* fopen ( char* filename, char* mode); filename
– стрінг, який містить повне ім'я файлу,
mode
– стрінг, який визначає режим роботи із файлом:
"r" "w" "a" "r+" "w+" "a+"
– відкрити існуючий файл для введення з нього (читання); – створити новий файл або відкрити (і звільнити від попереднього вмісту) існуючий файл для виводу (запису) у його початок; – створити новий файл для виводу або відкрити існуючий файл для виводу в кінець файлу; – відкрити існуючий файл для оновлення (тобто читання й запису), яке буде здійснюватись з його початку; – створити новий файл або відкрити існуючий файл для оновлення, яке буде здійснюватись з його початку; – створити новий файл або відкрити існуючий файл і підстроїтись у його кінець для оновлення.
Ця функція повертає вказівник (він називається ще файловою змінною) на структуру
FILE
, яка зберігає всю інформацію про файл.
У разі виникнення помилки при відкритті файлу ця функція повертає
NULL
. Якщо до символів, які задають режим, дописана літера умовчанням), якщо ж літера
b t
, то файл використовується як текстовий (цей режим діє за – то як двійковий.
Зауваження 1.
Хоча режим оновлення допускає як запис, так і читання із файлу, але при переході від операції запису до читання слід звертатись до стандартної функції
int fflush (FILE* fp);
яка виконує додатковий запис усіх даних, що ще залишились у буфері.
Зауваження 2.
Всі функції, які працюють із файлами, підключаються через файл
stdio.h
або
cstdio
.
Для закриття файлу використовується стандартна процедура:
int fclose (FILE* fp);
Деякі стандартні функції для роботи з файлами в мові С
1.
int fgetc (FILE*fp);
Здійснює введення чергового символу із вказаного файлу. Якщо повертає константу
EOF
, то сталась помилка або досягнуто кінця файлу.
2.
int fputc (int ch, FILE*fp);
Виводить символ з кодом
ch
у вказаний файл. Повертає змінну з кодом
ch
або
EOF
, якщо сталась помилка.
3.
char * fgets (char *s, int n, FILE *fp);
Здійснює введення в стрінг
s
(буфер) символів із файлу
fp
, до тих пір, поки не виконається одна з умов: • виникає символ • прочитано
n-1 '\n'
(початок нового рядку); • досягнутий кінець файлу; символів.
Після цього стрінг доповнюється
'\0'
. У першому випадку перед
'\0'
записується Якщо читання із файлу завершено успішно, то повертає вказівник на стрінг
s '\n'
. , у разі помилки – повертає
NULL
.
4.
int fputs (char *s, FILE *fp);
Ця функція виводить стрінг
s
у вказаний файл. Повертає
0 EOF
, якщо сталась помилка.
або
5.
int fprintf (FILE *fp , char *format, …);
Ця функція здійснює форматований вивід своїх аргументів у файл, який ідентифікується файловою змінною
fp
, під керівництвом стрінгу
format
. 6.
int fscanf (FILE *fp , char *format, …);
Здійснює форматоване, визначене стрінгом
format
, введення з вказаного файлу. 7.
int feof (FILE *fp);
Повертає не
0
(тобто
ІСТИНУ
), якщо при читанні із файлу був досягнутий кінець файлу і
0
(тобто
ХИБНІСТЬ
) у супротивному випадку.
8.
int ferror (FILE *fp);
Повертає не
0
(тобто
ІСТИНУ
), якщо при виконанні операцій введення або виведення із файлом
fp
виникали помилки і
0
(тобто
ХИБНІСТЬ
) у супротивному випадку.
9.
void rewind (FILE *fp);
Покажчик поточної позиції у файлі пересувається на початок файлу. При цьому покажчик кінця файлу та покажчик помилок занулюються.
Стандартна послідовність дій для роботи з файлом виглядає наступним чином: FILE *fp_in = fopen ( "G:\\in.txt" , "r" );
if
(fp_in) // якщо файл існує { // тут працюємо з файлом fclose (fp_in); }
else
// якщо файл не існує fprintf (stderr, "\n Error!!!" );
Файли прямого доступу
Прямий (direct access) (на відміну від послідовного) доступ до файлу реалізують наступні стандартні функції: 1.
2.
3.
int fgetpos ( FILE *fp, fpos_t *pos);
Заносить у змінну
pos
, типом якої є
fpos_t
(це синонім типу
long int
), значення поточної позиції у файлі
fp
. Повертає
0
, якщо позиція
pos
успішно визначена.
int fsetpos ( FILE *fp, fpos_t *pos);
Встановлює у файлі
fp
поточну позицію в положення, визначене вказівником
pos
. Останній мав бути раніше визначений функцією
fgetpos
встановлена.
. Повертає
0
, якщо позиція
pos
успішно
int fseek ( FILE *fp, long offset, int from_where);
Встановлює у файлі
fp
поточну позицію в положення, що відстоїть на аргументом
offset
байтів від положення, визначеного
from_where
у бік кінця файлу при початку при
offset <0
. Аргумент
from_where offset >0
і в бік може набувати значення однієї з трьох стандартних констант:
SEEK_SET (=0)
– відлік від початку файлу; позиції у файлі;
SEEK_CUR (=1) SEEK_END (=2)
– відлік від поточної – відлік від кінця файлу. Повертає
0
, якщо позиція успішно встановлена.
Функції прямого введення-виведення в мові С size_t fread (void* ptr, size_t size, size_t num, FILE* filename);
Читає із файлу
filename
в масив
ptr
не більше
num
елементів розміру менше заявленої).
size
. Повертає кількість успішно прочитаних елементів (вона може бути
size_t fwrite (void* ptr, size_t size, size_t num, FILE* filename);
Записує у файл
filename
із масиву
ptr
елементів розміру
size
. Повертає кількість успішно записаних елементів.