- •Int main() /* головна обов’язкова функція, де ключове слово int означає, що функція main() повертатиме у точку виклику результат цілого типу*/ 6
- •Засоби розробки с програм
- •Директиви препроцесора.
- •Using namespace std; // вказуємо, що будемо працювати з іменами із стандартної бібліотеки
- •Запитання
- •Тема 2. Данні
- •Команда присвоєння. Правила узгодження типів.
- •Запитання
- •Тема 3. Операції та вирази
- •Тема 4. Потоки. Введення - виведення даних
- •Форматування даних
- •Введення-виведенні засобами бібліотеки сstdіo
- •Тема 5. Адреси даних. Вказівники. Динамічна пам’ять
- •Тема 6. Файли
- •Тема 7. Розгалуження
- •Логічні вирази та логічні операції.
- •Команда ?
- •Тема 8. Цикли
- •Команда циклу з післяумовою do-while має вигляд
- •Тема 9. Функції (1)
- •Тема 10. Функції (2)
- •Тема 11. Масиви
- •Тема 12. Рядки
- •Тема 13. Структури, списки, стеки, черги, об’єднання
- •Тема 14. Виняткові ситуації
- •Http://www.Rate1.Com.Ua/strannosti/2633/ Самі фатальні помилки в програмному забезпеченні
- •Помилки під час виконання (виняткові ситуації, виключення) Exceptions - це помилки, що виникають у випадку, коли програма намагається виконати неприпустиму операцію.
- •Тема 15. Графіка
- •Написание простых графических программ
- •Http://www.Rsdn.Ru/article/opengl/ogltut2.Xml Графическая библиотека OpenGl
Тема 6. Файли
Часто виникає потреба опрацьовувати інформацію, розміщену на зовнішніх носіях (на дисках), або виводити результати програми не на екран монітора, а у файл. Прикладами таких даних є інформація про розклад руху транспорту, успішність студентів, наявність товарів у магазинах, адреси, анкетні дані тощо.
Файл це сукупність даних, які розміщені на зовнішньому носії, зокрема, на жорсткому диску. Дані у файлі називаються елементами. Кількість даних під час опрацювання файлів не зазначають. Файли можуть містити як текстову, так і числову інформацію.
Існує декілька бібліотечних функцій, які дають змогу зчитати інформацію з файлу або спрямовувати потік виведення у файл. Функції, які розглядатимемо, описані в бібліотеці fstream.h. Тому для роботи з файлами насамперед необхідно підключити саме цю бібліотеку.
Зауваження 1. У модулі fstream.h також містяться описи стандартних потоків cout і сіn. Тому, щоб зчитати інформацію з файлу і вивести її на екран монітора, модуль iostream.h підключати в деяких компіляторах не обов’язково(в dev c++ потрібно).
Для опрацювання файлу його необхідно відкрити, виконати потрібні дії та закрити.
Зчитування даних із файлу. Щоб зчитати вхідні дані з файлу, необхідно оголосити файлову змінну та відкрити файл для читання так (розглянемо два способи):
ifstream <назва файлової змінної>(<зовнішня назва>, ознака1 |ознака2 | ... | ознакаN);
або так:
ifstream <назва файлової змінної>;<назва файлової змінної>.ореn(<зовнішня назва>);
Дія команд. Підключаємо потік введення даних із файлу та налагоджуємо зв’язок між файловою змінною у програмі та файлом на зовнішньому носії. Назву зовнішнього файлу треба записувати у лапках. Ознаки слугують для визначення прав доступу до файлу (див. пункт „Ознаки”). Ознаки зазначати необов'язково. У випадку, коли їх задавати не потрібно, наведені дві форми запису тотожні, і можна обирати одну з них.
Приклад 1. Відкрити зовнішній файл MyText.txt для читання з нього даних можна так:
ifstream MyFile("MyText.txt");
або так:
ifstream MyFile; MyFile.open("MyText.txt");
Тут MyFile - це файлова змінна, що асоціюється у програмі з відповідним зовнішнім файлом на диску. Введення даних виконують командою введення >>.
Наприклад, команда MyFile >> text;
зчитає одне дане з початку файлу MyText.txt до першого пропуску чи до символу „кінець рядка” у змінну text. Якщо треба зчитати наступне дане (яке розміщене між першим і другим пропусками), необхідно повторити попередню команду, тобто записати команди MyFile >> text;
MyFile >> text1;
або використати команду
MyFile >> text >>text1;.
Отже, зчитати дані з файлу можна за допомогою команди:
< назва файлової змінної> >> <змінна 1> >> <змінна 2> >> ... >> <змінна N>
Після опрацювання файлу його потрібно закрити. Це роблять так:
<назва файлової змінної>.сlosе()
Наприклад, MyFile.close(). Файл MyText.txt буде закрито. Після цього файлову змінну MyFile у разі потреби можна зв’язати з іншим файлом на диску.
Визначити кінець файлу можна за допомогою функції eof() (eof - end of file, кінець файлу):
<назва файлової змінної>.еоf()
Ця функція повертає нульове значення, якщо досягнуто кінця файлу.
Приклад 2. Нехай у деякому текстовому редакторі створено файли text1.dat і text2.dat. Послідовно зчитаємо з них дані та виведемо їх вміст на екран.
#include <iostream> // std::cout
#include <fstream> // std::ifstream
//using namespace std; //необхідно для ifstream та cout, але в цій програмі оголошено явно
int main()
{
std::ifstream File1 ("text1.dat"); //Поки не досягнуто кінця файлу text1.dat
while (!File1.eof()) // Знак ! означає операцію не
{
char *t = new char[30]; // Надаємо місце в пам'яті для зчитуваного даного до 30 символів
File1>> t; // Зчитуємо дане з файлу
std::cout << t << "\n"; // Виводимо це дане на екран
delete [] t; // Вивільняємо пам'ять
}
//Повертаємось на початок команди while
File1.close(); // коли досягнуто кінця файлу, закриваємо його
File1.open("text2.dat"); // Відкриваємо файл text2.dat для читання
while (! File1 .eof()) // Поки не досягнуто кінця файлу
{
char *t = new char[30];
File1 >>t;
std::cout << t << "\n"; delete[] t;
}
File1.close();
}
Детальніше про команду while див. у § 9. Оскільки у програмі виділяється пам’ять відразу для 30 символів, то використовуємо команду delete[] (див. § 12).
Виведення даних у файл. Відкрити файл для записування у нього даних можна так:
ofstream <назва файлової змінної>(<зовнішня назва>,ознака1 | ознака2 |... | ознакаN)
aбо так:
ofstream <назва файлової змінної>; <назва файлової змінної>.ореn(<зовнішня назва>);
Дія команд. Підключаємо потік виведення у файл і налагоджуємо зв’язок між файловою змінною у програмі та файлом на зовнішньому носії. Ознаки зазначати не обов’язково.
Приклад 3. Відкрити файл MyTextl.txt для запису у нього даних можна так (тут FileForZap - файлова змінна):
ofstream FileForZap("MyText1 .txt");
або так:
ofstream FileForZap; FileForZap.open("MyTextl .txt");
Щоб занести дані у файл, використовують команду виведення даних <<. Наприклад, після виконання команд int n = 10; FileForZap << n; у файл MyTextl.txt буде занесено число 10. Занести декілька даних у файл можна так само, як і вивести їх на екран: використовуючи стандартні правила команди << та керуючі послідовності.
Отже, записати дані у файл можна так:
<назва файлової змінної> << <змінна 1> << <змінна 2> << ... << <змінна N>
Ознаки. Ознаки слугують для зміни правил доступу до файлу. Розглянемо деякі з них:
Ознака |
Призначення |
ios::in |
Відкриває файл для читання з нього інформації. Вміст файлу зберігається |
ios::out |
Відкриває файл для записування інформації. Якщо файл не існує, то буде створений |
ios::app |
Відкриває файл для дописування інформації. Дані будуть записані у кінець файлу |
ios::trunk |
Якщо файл, який відкривають для записування вже існує, то його вміст буде вилучено |
ios::nocreate |
Забороняє створювати файл, який відкривають |
ios::noreplace |
Забороняє перезаписати існуючий файл |
Приклад 4. Після оголошення
ofstream Flags("text1.dat", ios::app, ios::noreplace);
можна дописати до кінця вже існуючого файлу text1.dat потрібну інформацію.
Якщо ж оголосити потік Flags так:
ofstream Flags("text1.dat", ios::noreplace);
і спробувати щось записати у файл, то жодних дій не відбудеться, оскільки ознака ios::noreplace забороняє змінювати існуючий файл. Проте якщо цю ознаку застосувати до нового файлу, якого ще немає на диску, наприклад, записати
ofstream Flags(“text3.dat", ios::noreplace);
то буде створено файл text3.dat, в який можна буде заносити дані.
Якщо потік оголосити так:
ofstream Flags("text4.dat", ios::nocreate);
то можливі два варіанти. Якщо файл text4.dat вже існує, то він може бути відкритий для записування даних. Якщо ж раніше такого файлу на диску не було, то в кращому випадку у файл нічого не запишеться, а в гіршому - програма зависне.
Задача 1 (про змагання спортсменів). Нехай необхідно занести у файл прізвища та результати трьох переможців змагань із фігурного катання. Вивести вміст файлу на екран для візуального контролю.
// Програма Спорт
#include <iostream> // std::cout, сіn
#include <fstream> //std::ofstream, ifstream
using namespace std;
int main()
{
//Відкриємо файл для записування
ofstream File1 ("sport.txt");
char name[15];
float bal;
cout << "Уведіть прізвище та результат першого спортсмена\n";
cin >> name >> bal;
File1 << name << "\t" << bal << "\n"; // Записуємо дані у файл
cout << "Уведіть прізвище та результат другого спортсмена\n";
cin >> name >> bal;
File1 << name << "\t" << bal << "\n"; // Записуємо дані у файл
cout << "Уведіть прізвище та результат третього спортсмена\n";
cin >> name >> bal;
File1<<name << "\t" " bal " "\n";
File1.close(); // Закриваємо файл
cout << "Виведемо вміст файлу\n";
ifstream File2("sport.txt");
cout << "Перше місце \t";
File2 >> name>> bal; // Зчитуємо дані з файла
cout << name << "\t" << bal <<"\n";
cout << "Друге місце \t"; File2 >> name >> bal;
cout << name << "\t" << bal << "\n";
cout << "Третє місце \t";
File2 >> name >> bal;
cout << name << "\t" << bal << "\n";
}
4. Закриття файлів
Робота з жорстким диском - дуже повільна операція, так як доступ до його пам'яті - механічний, обчислюється мілісекундами.
Для того, щоб на диск записувати по-рідше, але по-більше за раз, дані спочатку пишуться в буфер оперативної пам'яті, а коли буфер заповнюється, все це разом зливається вже на диск.
Закриття потоку гарантує, що будь-які дані, що знаходяться в буфері і ще не записані на диск, будуть туди записані.
Відсутність цієї команди може призвести до втрати даних у файлі, який був відкритий для запису (дозаписи).
Якщо не закривати файли (які відкриті навіть для читання), то це може призвести до обмеження доступу до файлу для інших програм.
В ОС Windows якщо файл відкритий на читання і не закривається, то з іншої програми його не можна видалити.
У будь-якій ОС є обмеження на кількість одночасно відкритих файлів. І це ще одна причина для закриття файлів.
Вправи
Модифікуйте програму Спорт так, щоб записати у файл прізвище, місце та результат спортсмена. Зчитайте інформацію з файлу та виведіть її на екран для контролю.
У текстовому редакторі створіть файл druzi.txt, у який занесіть прізвища п’яти ваших друзів. Складіть програму, яка б додавала інформацію ще про трьох осіб і результати записувала у файл druzil.txt. Виведіть уміст файлів druzi.txt і druzil.txt на екран.
У текстовому редакторі створіть файл, у який занесіть координати вершин трикутника. Розв’яжіть задачу № 2 вашого варіанта, використовуючи утворений файл. Результати виведіть на екран і у файл.
12.1.1, 12.1.2, 12.1.8, 12.2.1,12.8.1
Zubenko-Omelchuk 3.10.5, стор.424
Burn Straustrup 21.5, стор. 751
