Файловий ввід/вивід мови C
Файловий ввід/вивід мови C — це розділ мови C про роботу з файлами за допомогою спеціальних функцій, доступ до яких надає заголовний файл <stdio.h> [1] через їхні прототипи.
У середовищі Unix, з якого бере свій початок C, файл розглядається як неперервна послідовність байтів, кожен з яких може бути прочитаний окремо. Це відповідає структурі, яку використовує і мова C. Система вводу/виводу мови C використовує поняття потоку — абстракцію, яка дозволяє програмісту працювати з файлом. Потоки є двох видів: текстовий — послідовність символів, бінарний — послідовність байтів.
FILE
— це структура, в якій зберігається інформація про файл: його ім'я, статус, поточне положення курсору та інші. Вказівник файлу представляє собою вказівник на цю структуру. Він описує файл. У деякій літературі також вживається термін дескриптор файлу.
Приклад оголошення вказівника файлу:
FILE *myFile;
Макрос | Значення |
---|---|
NULL | Нульовий вказівник, еквівалентний 0 |
EOF | Кінець файлу, рівний -1 |
FOPEN_MAX | Кількість файлів, які можуть бути відкриті одночасно |
Функція fopen()
дозволяє відкрити файл. Першим аргументом цієї функції є рядок, який містить назву файлу, а другий аргумент — рядок режиму, у якому він повинен бути відкритий. Функція повертає вказівник файлу [4].
FILE *fopen(const char *fileName, const char mode);
Якщо під час відкриття файлу виникне помилка, то повертається NULL
.
Режим | Опис |
---|---|
r | Відкрити файл для читання |
w | Створити пустий файл для запису. Якщо такий файл вже існує, то його вміст стирається |
a | Дописати дані у кінець файлу. Створення нового файлу, якщо вказаний не існує |
r+ | Відкрити файл для читання і запису. Файл повинен існувати |
w+ | Створити пустий файл для читання і запису. Якщо такий файл вже існує, то його вміст стирається |
a+ | Відкрити файл для читання і запису з додавання даних у кінець існуючого файлу, або створення нового пустого файлу.
Читати можна весь файл, але добавляти дані можна тільки у кінець |
rb | Відкрити бінарний файл для читання |
wb | Створити бінарний файл для запису |
ab | Додати інформацію в кінець бінарного файлу |
r+b | Відкрити бінарний файл для читання і запису |
w+b | Створити бінарний файл для читання і запису |
a+b | Додати інформацію у кінець бінарного файлу, або створити бінарний файл для читання і запису |
Функція fclose()
закриває потік, раніше відкритий функцією fopen()
. Помилка, яка може виникнути при закритті файлу, може спричинити втрату даних чи знищення файлу [5].
int fclose(FILE *filePointer);
filePointer
— вказівник файлу, отриманий з функції fopen()
.
Приклад:
#include <stdio.h> // для функцій роботи з файлами
int main() {
FILE *myFile = fopen("example.txt", "r"); // відкриття файлу для читання
if (myFile == NULL) { // перевірка на помилки
printf("Error!\n");
return -1;
}
fclose(myFile); // закриття файлу
return 0;
}
Функція fputc()
використовується для запису символу.
int fputc(int symbol, FILE *filePointer);
Функція fgetc()
використовується для читання символу.
int fgetc(FILE *filePointer);
Коли, при читанні символів, досягається кінець файлу, функція fgetc()
повертає значення EOF
.
Приклад:
#include <stdio.h> // для функцій роботи з файлами
int main() {
FILE *myFile = fopen("example.txt", "a+"); // для читання і запису
char symbol;
if (myFile == NULL) { // перевірка на помилки
printf("Error!\n");
return -1;
}
// почергове зчитування символів
do {
symbol = fgetc(myFile);
putchar(symbol);
} while (symbol != EOF);
printf("\nEnter some symbol: ");
scanf("%c", &symbol);
fputc(symbol, myFile); // запис символу
fclose(myFile); // закриття файлу
return 0;
}
Функція fputs()
записує в потік filePointer
рядок, на який вказує перший аргумент str
. При виникненні помилки повертає EOF
.
int fputs(const char *str, FILE *filePointer);
Функція fgets()
зчитує рядок заданої довжини length
, або поки не зустріне символ переходу. Повертає вказівник на введений рядок в разі успішного виконання, або NULL
у разі помилки.
int *fgets(char *str, int length, FILE *filePointer);
Приклад:
#include <stdio.h> // для функцій роботи з файлами
int main() {
FILE *myFile = fopen("example.txt", "a+"); // відкриття для запису і читання
if (myFile == NULL) { // перевірка на помилки
printf("Error!\n");
return -1;
}
// зчитування рядка
char data[100];
fgets(data, 100, myFile);
printf("%s", data);
// запис рядка у файл
char str[100];
char symbol;
unsigned i = 0;
printf("\nEnter some string: ");
for (; ((symbol = getchar()) != '\n') && (i < 99); ++i) {
str[i] = symbol;
}
str[i] = '\0';
fputs(str, myFile); // запис у файл
fclose(myFile); // закриття файлу
return 0;
}
Для видалення файлу використовується функція remove()
, яка єдиним аргументом приймає назву файлу. У разі успішного виконання повертає 0, а в іншому випадку — значення відмінне від нуля.
int remove(const char *fileName);
- ↑ CPlusPlus. cplusplus.com (English) . Процитовано 27 листопада 2024.
- ↑ C - File I/O. GeeksforGeeks (амер.). 4 листопада 2022. Процитовано 7 листопада 2024.
- ↑ File input/output - cppreference.com. en.cppreference.com. Процитовано 7 листопада 2024.
- ↑ Ritchie, Dennis M. (1988). The C Programming Language. 2nd Edition (English) . Pearson. с. 279. ISBN 978-0131103627.
- ↑ TylerMSFT (26 жовтня 2022). File Handling. learn.microsoft.com (амер.). Процитовано 27 листопада 2024.
- ↑ Prata, Stephen (2013). C Primer Plus (English) . с. 1072. ISBN 978-0321928429.