- •Тема. Створення та оброблення файлів даних
- •Основні функції, константи, типи та макроси для роботи з файлами
- •Оголошення змінних типу файл
- •Відкриття файлу
- •Використання функцій fread() та fwrite()
- •Функції fscanf() та fprintf()
- •Стандартні потоки
- •Перенаправлення потоків
- •Зчитування та запис текстових файлів
- •Зчитування та запис двійкових (бінарних) файлів Функції get() та put()
- •Функції read() та write()
Стандартні потоки
На початку виконання будь-якої програми, що написана на мові С, автоматично відкривається з потоки:
stdin – стандартний потік введення, як правило використовується для введення з клавіатури;
etdout – стандартний потік виведення, як правило використовується виведення на дисплей/монітор;
stderr – стандартний потік помилок.
Потоки stdin, stdout та stderr є можливість застосовувати як файлові вказівники в будь-якій функції, що використовує вказівник типу file*.
Приклад зчитування з клавіатури символьного рядка використовуючи потік введення. Необхідно відмітити, що такий спосіб введення більш коректний ніж використання функції gets(), тому що при її використанні виникають проблеми з переповненням. Єдиним мінусом використання функції fgets() є те, що вона зчитує та записує символьний рядок з символом переходу на наступний рядок. В наведеному прикладі показано як здійснити введення та заміни символу переходу у разі потреби.
#include <stdio.h> #include <string.h> int main() { char str[80]; int i; |
|
printf("Введіть символьний рядок: "); |
|
fgets(str, 10, stdin); |
// зчитування символьного рядка з потоку stdin, що відповідає за введення та по замовчуванню є клавіатурою |
i = strlen(str)-1; |
// визначаємо довжину символьного рядка |
/* Перевіряємо кінцевий символ чи є він переходом на наступний рядок, а потім знищуємо його */ | |
if(str[i]=='\n') str[i] = '\0'; |
|
printf("Введений рядок %s", str); |
//виводимо символьний рядок |
return 0; } |
|
Перенаправлення потоків
Для пере направлення потоків використовується функція freopen(). Її можна використовувати для пере направлення стандартних потоків, що дуже корисно при відлагоджені програми, наприклад здійснюється виведення не на екран, а у файл.
FILE *f reopen (const char *имя_файлу, const char *режим, FILE *поток)
Параметр режим може мати такі ж самі значення як у функції fopen().
В наступному прикладі функція freopen() перенаправляє стандартний потік stdout у файл OUTPUT.
#include <stdio.h> int main(void) { char str[80]; |
|
freopen("c:\\output.txt", "w", stdout); |
|
printf("Введіть символьний рядок: "); gets(str); printf(str); return 0; } |
|
Результат виконання
Результат запису потоку у файл
Робота з файлами у С++
Для работи з файлами в мові С++ використовуються класи потоків, для їх використання використовується бібліотека fstream.
Існує 3 основні класи для потоків:
ifstream використовується для роботи з файлами в режимі зчитування;
ofstream – в режимі запису;
fstream – запису та зчитування.
Оголошення змінних, що будуть пов’язані з відповідним потоком, відбувається наступним чином:
#include < fstream.h>
ifstream inf; – оголошена зміна inf для потоку в режимі запису;
ofstream outf; – оголошена зміна outf для потоку в режимі зчитування;
fstream iof; – оголошена зміна iof для потоку в режимі зчитування та запису.
Відкриття файлу здійснюється командою, що має наступну специфікацію:
<Змінна, що пов’язана з потоком> .open(<ім’я файла>,<режим роботи> , <режим доступу до файлу>);
По замовчувані усі файли відкриваються в текстовому режимі.
Файл може бути відкритий в одному з наступних режимів:
ios::in — відкриття файлу в режимі зчитування даних, він є режимом по замовчуванні для потоку ifstream;
ios::out — відкриття файлу в режимі запису даних (при цьому існуючий файл знищується), він є режимом по замовчуванню для потоку ofstream;
ios::binary — відкриття файлу в двійковому (бінарному) режимі;
ios::app — відкриття файлу в режимі запису даних в кінець файлу;
ios::ate — перейти в кінець вже відкритого файлу;
ios::trunc — очищує файл, це ж відбувається в режимі ios::out;
ios::nocreate —забезпечує виконання операції тільки відкриття файлу тільки для існуючого файлу;
ios::noreplace — не дозволяє відкривати існуючий файл.
Режими відкриття файлу є можливість об’єднувати знаком «и» («|»), наприклад при відкриті файлу для запису даних в бінарному (двійковому) режимі необхідно задани ios::out | ios::binary. Якщо параметр режиму доступу не вказано робота з потоком буде відбуватися по замовчуванні для цього потоку.
Режим доступу до файлу визначаються атрибутами типу int
-
Атрибут
Значення
0
Нормальний файл, відкритий доступ
1
Файл тільки для зчитування
2
Скритий файл
4
Системний файл
8
Архівний файл
При відкритті файлу файловій (потоковій) змінній присвоюється значення true, в іншому випадку false.
Закриття роботи з потоком здійснюється командою:
<потокова (файлова) зміна>.close();