Розширення файлу C. Що таке розширення файлу C? Клас fstream: довільний доступ до файлу

Розширення файлу C. Що таке розширення файлу C? Клас fstream: довільний доступ до файлу

Текстові файли

Розглянемо роботу з текстовим файлом Сі на прикладі. Створіть на диску текстовий файл з ім'ям TextFile.txt. Наберіть у цьому файлі такі рядки:

String_1 123 String_11, 456
String_2
String_3

Збережіть файл.

А це код програми на C, яка відкриває наш файл та зчитує з нього рядки:

/* *Author: @author Subbotin B.P..h> #include #define LEN 50 int main(void) ( puts("Text file operations"); char cArray; FILE *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( puts("Problems"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile); return EXIT_SUCCESS; )

Щоб відкрити текстовий файл у C використовуємо функцію fopen:

FILE *pTextFile = fopen("C:\TextFile.txt", "r");

перший аргумент функції fopen вказує на файл, а другий каже, що файл відкритий для його читання.

Рядки зчитуємо за допомогою функції fgets:

fgets(cArray, LEN, pTextFile);

перший аргумент функції fgets вказує на масив символів, в якому будуть збережені отримані рядки, другий аргумент – це максимальна кількість символів для зчитування, третій – наш файл.

Після завершення роботи з файлом, його потрібно закрити:

fclose(pTextFile);

Отримуємо:

Російські літери у рядках теж проходять.

До речі, цю програму я зробив у Eclipse. Як працювати з C/C++ в Eclipse можна переглянути .

Отже, ми відкрили та рахували дані з текстового файлу.

Тепер навчимося програмно створювати текстовий файл та записувати в нього дані.

/* Author: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "This is a string"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) ( puts("Problems"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine); fprintf(pTextFile, "%d", nVal); ;)

Створюємо текстовий файл для запису даних:

FILE *pTextFile = fopen("C:\TextFileW.txt", "w");

якщо файл вже є, то він буде відкритий, і всі дані будуть видалені.

C-рядок cString і число nVal записуються програмою в текстовий файл. cNewLine – це просто перехід на новий рядок.

Записуємо дані до текстового файлу за допомогою функції fprintf:

fprintf(pTextFile, "%s%c", cString, cNewLine);

перший аргумент тут – наш файл, другий – форматний рядок, третій і більше – необхідна для цього формату кількість аргументів.

Файли дозволяють користувачеві зчитувати великі обсяги даних безпосередньо з диска без введення їх з клавіатури. Існують два основні типи файлів: текстові та двійкові.

Текстовиминазиваються файли, які з будь-яких символів. Вони організуються по рядках, кожен із яких закінчується символом « кінця рядка». Кінець самого файлу позначається символом « кінця файлу». При записі інформації в текстовий файл, який можна переглянути за допомогою будь-якого текстового редактора, всі дані перетворюються до символьного типу і зберігаються в символьному вигляді.

У двійковихВ файлах інформація зчитується і записується у вигляді блоків певного розміру, в яких можуть зберігатися дані будь-якого виду та структури.

Для роботи з файлами використовуються спеціальні типи даних. потоками.Потік ifstreamслужить до роботи з файлами як читання, а ofstreamв режимі зйомки. Для роботи з файлами як записи, так і читання служить потік fstream.

У програмах на C++ під час роботи з текстовими файлами необхідно підключати бібліотеки iostreamі fstream.

Для того, щоб записувати дані в текстовий файл, необхідно:

  1. описати змінну типу ofstream.
  2. open.
  3. вивести інформацію у файл.
  4. обов'язково закрити файл.

Для зчитування даних із текстового файлу необхідно:

  1. описати змінну типу ifstream.
  2. відкрити файл за допомогою функції open.
  3. рахувати інформацію з файлу, при зчитуванні кожної порції даних необхідно перевіряти, чи кінець файлу досягнуто.
  4. закрити файл.

Запис інформації до текстового файлу

Як було сказано раніше, щоб почати працювати з текстовим файлом, необхідно описати змінну типу ofstream. Наприклад, так:

ofstream F;

Буде створено змінну Fдля запису інформації у файл. На наступному етапі файлу необхідно відкрити для запису. У загальному випадку оператор відкриття потоку матиме вигляд:

F.open("file", mode);

Тут F- змінна, описана як ofstream, file- повне ім'я файлу на диску, mode- режим роботи з файлом, що відкривається. Зверніть увагу, що при вказівці повного імені файлу потрібно ставити подвійний слєш. Для звернення, наприклад, до файлу accounts.txt,що знаходиться в папці sites на диску D, у програмі необхідно вказати: D:\\sites\\ accounts.txt.

Файл може бути відкритий в одному з таких режимів:

  • ios::in- Відкрити файл в режимі читання даних; режим є стандартним режимом для потоків ifstream;
  • ios::out- відкрити файл у режимі запису даних (при цьому інформація про наявний файл знищується); режим є режимом за промовчанням для потоків ofstream;
  • ios::app- Відкрити файл в режимі запису даних в кінець файлу;
  • ios::ate- Пересунутись в кінець вже відкритого файлу;
  • ios::trunc- очистити файл, це відбувається в режимі ios::out;
  • ios::nocreate- не виконувати операцію відкриття файлу, якщо він не існує;
  • ios::noreplace- не відкривати наявний файл.

Параметр mode може бути відсутнім, у цьому випадку файл відкривається в режимі за промовчанням для цього потоку.

Після вдалого відкриття файлу (у будь-якому режимі) у змінній Fбуде зберігатися true, в іншому випадку false. Це дозволить перевірити коректність операції відкриття файлу.

Відкрити файл (як приклад візьмемо файл D:\\sites\\ accounts.txt) в режимі запису можна одним із наступних способів:

Після відкриття файлу в режимі запису буде створено порожній файл, який можна буде записувати інформацію.

Якщо ви хочете відкрити існуючий файл у режимі дозапису, то як режим слід використовувати значення ios::app.

Після відкриття файлу в режимі запису, в нього можна писати так само, як і на екран, тільки замість стандартного пристрою виводу coutпотрібно вказати ім'я відкритого файлу.

Наприклад, для запису в потік Fзмінної a, оператор виводу матиме вигляд:

F<

Для послідовного виведення в потік Gзмінних b, c, dоператор виведення стане таким:

G<

Закриття потоку здійснюється за допомогою оператора:

F.close();

Як приклад розглянемо таке завдання.

Завдання 1

Створити текстовий файл D:\\ sites\\accounts .txtі записати до нього nдійсних чисел.

Рішення

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{

int i, n;
double a;
//описує потік для запису даних у файл
ofstream f;
//відкриваємо файл у режимі запису,
//режим ios::out встановлюється за умовчанням
f.open («D: \\sites\\accounts.txt», ios:: out);
//вводимо кількість дійсних чисел
cout<< «n=» ; cin >> n;
//цикл для введення дійсних чисел
//і записи їх у файл
for (i = 0; i< n; i++ )
{
cout<< «a=» ;
//введення числа
cin >> a;
f<< a<< «\t «;
}
//закриття потоку
f.close();
system («pause»);
return 0;
}

Читання інформації з текстового файлу

Для того, щоб прочитати інформацію з текстового файлу, необхідно описати змінну типу ifstream. Після цього потрібно відкрити файл для читання оператором open. Якщо змінну назвати F, то перші два оператори будуть такими:

Після відкриття файлу в режимі читання з нього можна зчитувати інформацію так само, як і з клавіатури, тільки замість cinНеобхідно вказати ім'я потоку, з якого відбуватиметься читання даних.

Наприклад, для читання даних із потоку Fу змінну a, оператор введення виглядатиме так:

F>>a;

Два числа в текстовому редакторі вважаються розділеними, якщо між ними є хоча б один із символів: пробіл, табуляція, символ кінця рядка. Добре, коли програмісту заздалегідь відомо, скільки і які значення зберігаються у текстовому файлі. Однак часто відомий лише тип значень, що зберігаються у файлі, при цьому їх кількість може бути різною. Для вирішення цієї проблеми необхідно зчитувати значення з файлу по черзі, а перед кожним зчитуванням перевіряти, чи кінець файлу досягнуто. А допоможе зробити цю функцію F.eof(). Тут F- ім'я потоку функція повертає логічне значення: trueабо false, залежно від того чи досягнуто кінець файлу.

Отже, цикл для читання вмісту всього файлу можна записати так:

Для кращого засвоєння матеріалу розглянемо завдання.

Завдання 2

У текстовому файлі D:\game\accounts.txt зберігаються речові числа, вивести їх на екран і обчислити їх кількість.

Рішення

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int n = 0;
float a;
fstream F;
//відкриваємо файл у режимі читання
F.open («D: \\sites\\accounts.txt») ;
//якщо відкриття файлу пройшло коректно, то
if (F)
{
//цикл для читання значень із файлу; виконання циклу перерветься,
//Коли досягнемо кінця файлу, у разі F.eof() поверне істину.
while (! F.eof () )
{
//читання чергового значення потоку F в змінну a
F>> a;
//Виведення значення змінної a на екран
cout<< a<< «\t «;
//збільшення кількості лічених чисел
n++;
}
//закриття потоку
F.close ();
//Вовод на екран кількості лічених чисел
cout<< «n=» << n<< endl;
}
//якщо відкриття файлу пройшло некоректно, висновок
//повідомлення про відсутність такого файлу
else cout<< " Файл не існує"<< endl;
system («pause»);
return 0;
}

На цьому відносно об'ємний урок із текстових файлів закінчено. У наступній статті будуть розглянуті методи маніпуляції, за допомогою яких C++ обробляються .

Функція fopen() відкриває для використання потік, пов'язує файл із цим потоком і потім повертає покажчик FILE на даний потік. Найчастіше файл сприймається як дисковий файл. Функція fopen() має наступний прототип:

FILE *fopen(const char *ім'я_файлу, const char *режим);

Де режим вказує на рядок, який містить бажаний режим відкриття файлу. Допустимі значення для режиму Borland С++ показані в таблиці. Ім'я_файлу має бути рядком символів, що надає коректне ім'я файлу операційній системі, і може містити вказівку шляху.

Функція fopen() повертає вказівник базового типу FILE. Цей покажчик ідентифікує файл та використовується більшістю функцій файлової системи. Його ніколи не слід змінювати самостійно. Функція повертає нульовий покажчик, якщо файл не можна відкрити.

Як показує таблиця, файл може бути відкритий або в текстовому або в двійковому режимі. У текстовому режимі під час введення послідовність повернення каретки і переклад рядка транслюється символ нового рядка. При виведенні справедливо зворотне: символ нового рядка транслюється повернення каретки і переклад рядка. У двійкових файлах такого перекладу немає. Коли аргументі режиму не зазначені ні t, ні b, то статус файлу текстовий/двійковий визначається значенням глобальної змінної _fmode, визначеної в Borland З++. За промовчанням fmode встановлена ​​в О_ТЕХТ, тобто встановлюється текстовий режим. Якщо встановити _fmode в О_BINARY, файли будуть відкриватися в двійковому режимі. (Ці макроси визначені в fcntl.h.) Звичайно, використання явно зазначених t або b усуває ефекти, пов'язані зі змінною _fmode. Крім цього, _fmode характерна лише для продуктів Borland. Вона не визначена в системі введення/виведення ANSI.

Якщо необхідно відкрити файл з ім'ям test на запис, слід написати:

Fp = fopen ("test", "w");

Де fp – це змінна типу FILE*. Проте зазвичай можна побачити таке:

If((fp = fopen("test", "w"))==NULL) (
puts ("Cannot open file.");
exit (1);
}

Даний метод дозволяє виявити помилки під час відкриття файлу, наприклад, наявність захисту від запису або відсутність вільного місця на диску.

Якщо fopen() використовується для відкриття файлу на запис, будь-який раніше існуючий файл із зазначеним ім'ям буде видалений. Якщо файлу з вказаним ім'ям немає, він буде створено.

Якщо потрібно дописати інформацію до кінця файлу, слід використовувати режим а (додавання). Якщо файл не існує, він буде створений.

Відкриття файлу для читання вимагає наявності файлу. Якщо файл не існує, буде повернено помилку. Якщо файл відкритий для операції читання/запису, він не видаляється за наявності, і якщо файл немає, він створюється.

Таблиця: Допустимі значення режимів

Значення

Відкриває файл для читання. (Відкриває за замовчуванням як текстовий файл.)

Створює файл для запису. (Відкриває за замовчуванням як текстовий файл.)

Приєднує до файлу. (Відкриває за замовчуванням як текстовий файл.)

Відкриває двійковий файл для читання.

Відкриває двійковий файл для запису.

Приєднує до бінарного файлу.

Відкриває файл для читання/запису. (Відкриває за замовчуванням як текстовий файл.)

Створює файл для читання/запису. (Відкриває за замовчуванням як текстовий файл.)

Приєднує або створює файл для читання/запису. (Відкриває за замовчуванням як текстовий файл.)

Відкриває двійковий файл для читання/запису.

Створює двійковий файл для читання/запису.

Приєднує або створює двійковий файл для читання/запису.

Створення текстового файлу для запису.

Приєднує текстовий файл.

Відкриває текстовий файл для читання.

Створення текстового файлу для читання/запису.

Відкриває або створює текстовий файл для читання/запису.

Останнє оновлення: 25.10.2017

Для роботи з файлами в стандартній бібліотеці визначено заголовний файл fstream, який визначає базові типи для читання та запису файлів. Зокрема, це:

    ifstream: для читання з файлу

    ofstream : для запису у файл

    fstream : поєднує запис та читання

Для роботи з даними типу wchar_t для цих потоків визначено двійники:

    wifstream

    wofstream

    wfstream

Відкриття файлу

При операціях із файлом спочатку необхідно відкрити файл за допомогою функції open(). Ця функція має дві версії:

  • open(шлях, режим)

Щоб відкрити файл у функцію, необхідно передати шлях до файлу у вигляді рядка. Також можна вказати режим відкриття. Список доступних режимів відкриття файлу:

    ios::in : файл відкривається для введення (читання). Може бути встановлений тільки для об'єкта ifstream або fstream

    ios::out : файл відкривається для виведення (запису). При цьому старі дані видаляються. Може бути встановлений тільки для об'єкта ofstream або fstream

    ios::app : файл відкривається для запису. Старі дані не видаляються.

    ios::ate : після відкриття файлу переміщує покажчик у кінець файлу

    ios::trunc : файл усікається під час відкриття. Може бути встановлений, якщо також встановлено режим out

    ios::binary : файл відкривається у бінарному режимі

Якщо при відкритті режим не вказано, то за умовчанням для об'єктів ofstream застосовується режим ios::out, а для об'єктів ifstream - режим ios::in. Для об'єктів fstream поєднуються режими ios::out і ios::in.

Std::ofstream out; // потік для запису out.open("D:\hello1.txt"); // Відкриваємо файл для запису std:: ofstream out2; out2.open("D:\hello2.txt", std::ios::app); // Відкриваємо файл для дозапису std:: ofstream out3; out2.open("D:\hello3.txt", std::ios::out | std::ios::trunc); // встановлення декількох режимів std::ifstream in; // потік для читання in.open("D:\hello4.txt"); // Відкриваємо файл для читання std::fstream fs; // потік для читання-запису fs.open("D:\hello5.txt"); // Відкриваємо файл для читання-запису

Однак, в принципі, необов'язково використовувати функцію open для відкриття файлу. В якості альтернативи можна також використовувати конструктор об'єктів-потоків та передавати в них шлях до файлу та режим відкриття:

Fstream(шлях) fstream(шлях, режим)

При виклику конструктора, який передано шлях до файлу, цей файл буде автоматично відкриватися:

Std::ofstream out("D:\\hello.txt"); std::ifstream in("D:\\hello.txt"); std::fstream fs("D:\\hello.txt", std::ios::app);

Взагалі використання конструкторів для відкриття потоку є кращим, оскільки визначення змінної, що представляє файловий потік, вже припускає, що цей потік буде відкритий для читання або запису. А використання конструктора позбавить ситуації, коли ми забудемо відкрити потік, але при цьому почнемо його використовувати.

У процесі роботи ми можемо перевірити, чи файл за допомогою функції is_open() . Якщо файл відкритий, вона повертає true:

Std::ifstream in; // потік для читання in.open("D:\hello.txt"); // відкриваємо файл для читання // якщо файл відкритий if (in.is_open()) ( )

Закриття файлу

Після завершення роботи з файлом слід закрити за допомогою функції close() . Також варто відзначити, що при виході об'єкта потоку з області видимості він видаляється, і у нього автоматично викликається функція close.

#include #include int main() ( std::ofstream out; // потік для запису out.open("D:\\hello.txt"); // відкриваємо файл для запису out.close(); // закриваємо файл std:: ifstream in; // потік для читання in.open("D:\\hello.txt"); // відкриваємо файл для читання in.close(); // закриваємо файл std::fstream fs; // потік для читання -запису fs.open("D:\\hello.txt"); // відкриваємо файл для читання-запису fs.close(); // закриваємо файл return 0;

Варто зазначити, що при компіляції через g + + слід використовувати прапор -static, якщо програма працює з файлами і використовує типи із заголовного файлу fstream.

 

 

Це цікаво: