- •Тема. Створення та оброблення файлів даних
- •Основні функції, константи, типи та макроси для роботи з файлами
- •Оголошення змінних типу файл
- •Відкриття файлу
- •Використання функцій fread() та fwrite()
- •Функції fscanf() та fprintf()
- •Стандартні потоки
- •Перенаправлення потоків
- •Зчитування та запис текстових файлів
- •Зчитування та запис двійкових (бінарних) файлів Функції get() та put()
- •Функції read() та write()
Оголошення змінних типу файл
FILE *идентификатор;
Приклад FILE *f;
Открытие файла:
Відкриття файлу
Функція fopen() відкриває потік та зв’язує його з файлом, а після виконання повертає вказівник файлу. Якщо під час відкриття файлу виникла помилка тоді функція fopen() поверне вказівник на NULL.
Синтаксис функції:
*fopen( const char *ім_я_файлу, const char *режим)
ім_я_файлу – вказівник на символьний рядок, що включає повну назву (повний шлях та ім’я).
режим – вказівник на символьний рядок, що визначає режим доступу до файлу.
Табл. Допустимі значення параметру режим.
Параметр |
Значення |
r |
Відкриття текстового файлу тільки для зчитування. |
w |
Створення й відкриття текстового файлу для додавання. Якщо файл з таким ім’ям існує, тоді він буде замінений новим. |
a |
Відкриття текстового файлу для додавання запису в кінець файлу, якщо він не існує то буде створений. |
r+ |
Відкриття текстового файлу для зчитування та додавання. |
w+ |
Створення й відкриття текстового файлу для додавання та зчитування. Якщо файл з таким ім’ям існує, тоді він буде замінений новим. |
a+ |
Відкриття текстового файлу для додавання та зчитування запису в кінці файлу, якщо він не існує то буде створений. |
rb |
Відкриття бінарного файлу тільки для зчитування. |
wb |
Створення й відкриття бінарного файлу для додавання. Якщо файл з таким ім’ям існує, тоді він буде замінений новим. |
ab |
Відкриття бінарного файлу для додавання запису в кінець файлу, якщо він не існує то буде створений. |
r+b, rb+ |
Відкриття бінарного файлу для зчитування та додавання. |
w+b, wb+ |
Створення й відкриття бінарного файлу для додавання та зчитування. Якщо файл з таким ім’ям існує, тоді він буде замінений новим. |
a+b, ab+ |
Відкриття бінарного файлу для додавання та зчитування запису в кінці файлу, якщо він не існує то буде створений. |
Приклад: Вводимо з клавіатури символьний рядок та записуємо його у файл по одному символу.
#include <string.h> #include <stdio.h> #include <iostream> using namespace std; |
|
int main() { FILE *f; char sf[40]; char str[100]; |
// оголошуємо файлову змінну // змінна для повного імені файлу |
printf("Введіть ім’я файлу: "); gets(sf); f=fopen(sf, "w"); |
//відкриття файлу для запису |
if(f != NULL) { printf("Введіть символьний рядок : "); gets(str); for(int i=0;i < strlen(str);i++) putc(str[i],f); } else printf("Виникла помилка \n"); |
// якщо файловий вказівник не вказує на порожність, тоді виконуємо дії |
fclose(f); return 0; } |
// закриваємо файл |
Приклад: Зчитування символів з текстового файлу та виведення їх на екран.
#include <string.h> #include <stdio.h> #include <iostream> using namespace std; int main() { |
|
FILE *f; char sf[40]; char cs; |
// оголошуємо файлову змінну // змінна для повного імені файлу |
printf("Введіть ім’я файлу: "); gets(sf); f=fopen(sf, "r"); |
//відкриття потоку роботи з файлом для зчитування |
if(f != NULL) { |
// якщо файловий вказівник не вказує на порожність, тоді виконуємо дії |
do { |
|
cs=getc(f); |
//зчитування одного символу |
cout<<cs; |
//виведення символу на екран |
} while (cs!=EOF); |
// зчитуємо поки не кінець файлу, тобто коли символ буде вказувати на кінець файлу, зчитування припиняться |
} else printf("Виникла помилка \n"); |
|
fclose(f); |
// закриваємо потік роботи з файлом |
return 0; } |
|
Конструкція зчитування наведена в останньому прикладі може бути використана тільки для роботи з текстовим потоком, тому що при зчитування бінарного потоку при зчитуванні певного елементу в бінарному вигляді може призвести до прийняття зчитаного символу у вигляді EOF. Виходячи з вище сказаного доцільно використовувати функцію feof().
Підхід зчитування по одному елементу з текстового файлу |
Підхід зчитування по одному елементу з текстового та бінарного файлу |
do { |
while(!feof(f)) { |
cs=getc(f); |
cs=getc(f); |
cout<<cs; |
cout<<cs; |
} while (cs!=EOF); |
} |
Приклад запису символьних рядків у текстовий файл, після чого відбувається зчитування файлу по рядкам.
#include <string.h> #include <stdio.h> #include <iostream> using namespace std; int main() { |
|
FILE *f; char sf[40]; char str[80]; |
// оголошуємо файлову змінну // змінна для повного імені файлу // змінна для символьного рядку |
printf("Введіть ім’я файлу: "); gets(sf); f=fopen(sf, " w+"); |
//відкриття потоку роботи з файлом для запису та зчитування |
if(f != NULL) { |
// якщо файловий вказівник не вказує на порожність, тоді виконуємо дії |
// запис символьних рядків у файл | |
do { |
|
printf("Введіть рядок: "); |
|
gets(str); |
//зчитує символьний рядок |
strcat(str,"\n"); |
//додаємо ознаку закінчення рядку |
fputs(str,f); |
//запис символьного рядку в файл |
if (ferror(f)) printf("Виникла помилка запису!"); |
// якщо виникне помилка тоді ferror(f) буде дорівнювати true |
} while(*str!='\n') ; |
// введення призупиниться коли буде введено порожній рядок |
// курсор знаходиться в кінці файлу, тому необхідно перевести його на початок | |
rewind(f); |
//переводимо курсор на початок файлу |
// зчитування символьних рядків та запис їх у файл | |
while (!feof(f)) { fgets(str, 79, f);
|
//зчитування буде відбуватися доки не дійдемо до кінця файлу // fgets(str, 79, f) – зчитує у змінну str символьний рядок до кінця рядка або довжиною 78 з файлу, що пов’язаний з файловим вказівником f |
if (ferror(f)) printf("Виникла помилка зчитування!"); |
// якщо виникне помилка тоді ferror(f) буде дорівнювати true |
printf(str); } |
//виводимо на екран |
} else printf("Виникла помилка \n"); |
|
fclose(f); |
// закриваємо потік роботи з файлом |
return 0; } |
|