Перейти до вмісту

Файловий ввід/вивід мови C

Матеріал з Вікіпедії — вільної енциклопедії.
(Перенаправлено з Файловий ввід/вивід мови Сі)

Файловий ввід/вивід мови C — це розділ мови C про роботу з файлами за допомогою спеціальних функцій, доступ до яких надає заголовний файл <stdio.h> [1] через їхні прототипи.

У середовищі Unix, з якого бере свій початок C, файл розглядається як неперервна послідовність байтів, кожен з яких може бути прочитаний окремо. Це відповідає структурі, яку використовує і мова C. Система вводу/виводу мови C використовує поняття потоку — абстракцію, яка дозволяє програмісту працювати з файлом. Потоки є двох видів: текстовий — послідовність символів, бінарний — послідовність байтів.

Використовуваний тип FILE [2]

[ред. | ред. код]

FILE — це структура, в якій зберігається інформація про файл: його ім'я, статус, поточне положення курсору та інші. Вказівник файлу представляє собою вказівник на цю структуру. Він описує файл. У деякій літературі також вживається термін дескриптор файлу.

Приклад оголошення вказівника файлу:

FILE *myFile;

Використовувані макроси

[ред. | ред. код]
Макрос Значення
NULL Нульовий вказівник, еквівалентний 0
EOF Кінець файлу, рівний -1
FOPEN_MAX Кількість файлів, які можуть бути відкриті одночасно

Відкриття та закриття файлу за допомогою функцій fopen() та fclose() [3]

[ред. | ред. код]

Функція 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;
}

Читання і запис [6]

[ред. | ред. код]

Функції fputc() та fgetc()

[ред. | ред. код]

Функція 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() і fgets()

[ред. | ред. код]

Функція 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);

Примітки

[ред. | ред. код]
  1. CPlusPlus. cplusplus.com (English) . Процитовано 27 листопада 2024.
  2. C - File I/O. GeeksforGeeks (амер.). 4 листопада 2022. Процитовано 7 листопада 2024.
  3. File input/output - cppreference.com. en.cppreference.com. Процитовано 7 листопада 2024.
  4. Ritchie, Dennis M. (1988). The C Programming Language. 2nd Edition (English) . Pearson. с. 279. ISBN 978-0131103627.
  5. TylerMSFT (26 жовтня 2022). File Handling. learn.microsoft.com (амер.). Процитовано 27 листопада 2024.
  6. Prata, Stephen (2013). C Primer Plus (English) . с. 1072. ISBN 978-0321928429.