Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы.doc
Скачиваний:
59
Добавлен:
07.03.2016
Размер:
3.6 Mб
Скачать

Контрольні питання

  1. Що таке рекурсія?

  2. Переваги та недоліки рекурсивного програмування.

  3. Наведіть власний приклад рекурсії та проаналізуйте глибину рекурсії.

  4. Наведіть приклад рекурсії розрахунку факторіалу числа.

  5. Наведіть приклад рекурсії розрахунку n-го члену послідовності Фібоначчі.

  6. Наведіть алгоритм піднесення числа x до натурального степеня n.

Розділ 11. Робота з файлами

11.1. Робота з текстовими та бінарними файлами

Файли бувають двох типів: текстовими та бінарними (binary).

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

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

Для відкриття використовується функція-член open() з одним з об’єктів файлових потоків. Для закриття файлів використовується функція-член close():

Формат:

fs_obj.open(file_name, access);

fs_obj. close();

fs_obj – об’єкт, що являє собою файл.

file_name – рядок (або вказівка на рядок); може бути зазначений весь маршрут.

access – являє собою будь-яке значення з таблиці можливих режимів доступу (табл. 11.1) або комбінацію з використанням оператора АБО ( | )

Таблиця 11.1

Можливі режими доступу

Режим

Опис

Код

ios::in

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

1

ios::out

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

2

ios::ate

Відкрити файл і встановити вказівку на кінець

4

ios::app

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

8

ios::trunc

Видалити уміст файла

16

ios::nocreate

Якщо немає файла, повертає відмову

32

ios::noreplace

Якщо файл є, його відкриття тільки для додавання

64

ios::binary

Відкрити файл у двоічному режимі

128

Якщо ви відкриваєте файл для запису з опцією ios::out, C++ просто створює його. Якщо файл із цим ім’ям вже існує, C++ без усякого попередження перекриває старий файл, знищуючи його вміст.

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

cur_fs.open("tt.txt",ios::out | ios::nocreate)

Режим доступу до файлів по умовчанню – текстовий ASCII-файл.

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

Скажімо

int i = 31764;

для ASCII - коду – це 5 символів,

для двійкового машинного коду – це 2 байта.

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

Наприклад, якщо ви відкриваєте файл з опцією ios::nocreate і заданий файл не існує, С++ не відкриває цей файл. Виникнення помилки можна простежити у такий спосіб:

if(! cur_fs) cout << "Файл не існує";

Рекомендації: Краще відкривати файли перед їхнім використанням і закривати відразу ж після використання.

Запис у файл.

Найбільш розповсюдженні функції файлового введення-виведення:

  • get();

  • put().

Приклади:

Приклад 1.

#include <fstream>

using namespace std;

ofstream fp;

void main()

{

fp.open("nam.dat", ios::out);

fp<< "Петров Сергій\n";

fp<< "Сидоров Іван\n";

fp.close();

}

При перегляді файлу "nam.dat" отримаємо наступну інформацію

Петров Сергій

Сидоров Іван

Приклад 2. Запис у файл цифр від 1 до 100

#include <iostream>

#include <fstream>

using namespace std;

ofstream fp;

void main()

{

int i;

// Створення нового файла

fp.open("nam.dat", ios::out);

if(!fp)

cout << "Помилка відкриття файла\n";

else

{

for(i = 1; i < 101; i++)

fp << i << " ";

}

fp.close();

}

Виведення на принтер.

Принтер, також як і екран, можна розглядати як аналогію з файлом.

Приклад:

#include <fstream>

using namespace std;

ofstream prn;

void main()

{

prn.open("LPT1",ios::out);

prn << "Міша\n";

prn << "Петро\n";

prn.close();

}

Результат виконання програми:

Міша

Петро

Додавання у файл і читання з файла.

Приклад. Додати 3 прізвища у файл, у котрому вже є 2 прізвища:

Петров

Сидоров

#include <fstream>

using namespace std;

ofstream fp;

void main()

{

fp.open("name.dat", ios::app);

fp << "Козлов\n";

fp << "Ромін\nКравенко\n";

fp.close();

}

Якщо файл name.dat не існує, то створюється новий із трьома прізвищами.

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

#include <iostream>

#include <fstream>

using namespace std;

fstream fp;

void main()

{

char filename[12];

char in_char;

cout << "Введіть ім’я файла ";

cin >> filename;

fp.open(filename, ios::in);

if(!fp)

{

cout << "\nПомилка, файл не відкривається\n";

exit(0); //Вихід із програми

}

while(fp.get(in_char))

cout << in_char;

fp.close();

}

Приклад. Копіювання даних з одного файла в інший:

#include <iostream>

#include <fstream>

using namespace std;

ifstream in_fp;

ofstream out_fp;

void main()

{

char in_char;

char in_file[12];

char out_file[12];

cout << "Введіть ім’я початкового файлу ";

cin >> in_file;

cout << "Введіть ім’я вихідного файлу ";

cin >> out_file;

in_fp.open(in_file, ios::in);

if(!in_fp)

{

cout << "\n\nПочаткового файлу не існує\n";

exit(0);

}

out_fp.open(out_file, ios::out);

if(!out_fp)

{

cout << "\n\nПомилка відкриття вихідного файлу\n";

exit(0);

}

cout << "\nКопіювання\n";

while(in_fp.get(in_char))

out_fp.put(in_char);

out_fp.close();

in_fp.close();

}