Програмування. Структурний підхід (КПІ)
.pdf
Комп’ютерний практикум №5 Робота з файлами
Потоки С++
Більш сучасний підхід для роботи з файлами з’явився у стандарті мови С++. В даному підході використовуються потоки введення/виведення ifstream та ofstream.
Потоки ifstream та ofstream є класами (class). Більш докладно класи, їх властивості та основні принципи використання будуть розглядатися в учбовому курсі Програмування. Об’єктно-орієнтований підхід.
Важливим є те, що операції та функції, які застосовні до стандартних потоків введення/виведення cin та cout (ЛР №1), можна використовувати також і при роботі з ifstream та ofstream.
Відкрити файл можна при створенні потоку:
ifstream ( const char * filename, mode); ofstream ( const char * filename, mode);
або за допомогою відповідних їх методів
void open ( const char * filename, mode); void open ( const char * filename, mode);
з наступними параметрами:
filename — імя файлу, наприклад /etc/passwd;
mode — режим доступу до файлу.
У стандарті С++ визначено наступні режими доступу до файлу:
Табл. 5.8
app |
Доступ для додавання нової інформації. При виводі |
|
інформація додається в кінець файлу. |
||
|
||
ate |
Перемістити вказівник файлу в кінець. |
|
|
||
binary |
Режим доступу до бінарного файлу. |
|
in |
Доступ для читання. |
|
|
||
out |
Доступ для запису. |
|
|
||
trunc |
Створити пустий файл для читання та запису. Якщо |
|
|
файл вже існує, його вміст стирається. |
Режими доступу можуть поєднуватися за допомогою операції ‘або’ (|). Наприклад, режим ios::binary | ios::in визначає доступ тільки для читання бінарного файлу.
71
Комп’ютерний практикум №5 Робота з файлами
Відкрити файли за допомогою потоків введення/виведення можна наступним чином
// Відкрити файл для читання ifstream in1(“test.in”);
//Те ж, з використанням функції open() ifstream in2;
in2.open(“test.in”);
//Відкрити файл для запису
ofstream out1(“test.out”);
// Те ж, з використанням функції open() ifstream out2;
out2.open(“test.out”);
Потоки ifstream та ofstream дозволяють використовувати модифікатори (endl, width, setf, hex) та методи (getline()), що визначені також і для потоків cin та cout (див. ЛР № 1). Наприклад, записати ціле число в шістнадцятковій системі в файл можна наступним чином:
ofstream o(“test.txt”); o << hex << 1234;
Приклад 5.4
Прочитати 2 числа з вхідного файлу та записати в вихідний файл їх суму.
#include <iostream> #include <fstream>
int main()
{
using namespace std;
ifstream in("test.in"); if(!in)
{
cerr << "Cannot open input file!\n"; return -1;
}
72
Комп’ютерний практикум №5 Робота з файлами
int a, b;
in >> a >> b;
ofstream out("test.out"); if(!out)
{
cerr << "Cannot open output file!\n"; return -2;
}
out << a + b;
return 0;
}
Закрити файл можна за допомогою методу потоку void close(). Наприклад,
ifstream i(“test.txt”);
...
i.close();
Приклад 5.5
Виконання операцій над даними, зчитаними із файлу.
У наведеному нижче прикладі з файлу зчитується матриця, з якою далі виконуються прості операції.
#include <iostream> #include <fstream>
int main()
{
using namespace std;
// Відкрити файл тільки для читання ifstream in("tst4.in");
if(!in)
{
cerr << "Не можу відкрити вхідний файл!"; return -1;
}
73
Комп’ютерний практикум №5 Робота з файлами
int n, m;
in >> n >> m;
// Створити матрицю
int** mat = new int* [n]; for(int i = 0; i < n; ++i)
mat[i] = new int[m];
// Прочитати матрицю з файлу for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) in >> mat[i][j];
double sum = 0;
//Знайти суму всіх елементів матриці for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) sum += mat[i][j];
//Відкрити файл для запису
ofstream out("tst4.out");
if(!out)
{
cerr << "Не можу відкрити вихідний файл!"; return -2;
}
//Записати матрицю з коефіцієнтами розділеними на
//суму її елементів
for(int i = 0; i < n; ++i, out << endl) for(int j = 0; j < m; ++j)
out << '\t' << mat[i][j] / sum;
}
74
Комп’ютерний практикум №5 Робота з файлами
5.2. Варіанти завдань
Обов’язкові завдання
1.В файлі test.in записно цілі числа. Знайти їх суму. Результат запишіть в test.out. Для роботи з файлами використовуйте функції cstdio.
2.В файлі test.in записно цілі числа. Знайти їх суму. Результат запишіть в test.out. Для роботи з файлами використовуйте функції fstream.
3.В файлі test.in записано матрицю NxN. Знайдіть її детермінант. Результат запишіть в test.out. Для роботи з файлами використовуйте функції cstdio.
4.В файлі test.in записано матрицю NxN. Знайдіть її детермінант. Результат запишіть в test.out. Для роботи з файлами використовуйте функції fstream.
5.В файлі test.in записано текст англійською мовою. Запишіть в файл test.out всі рядки з файлу test.in, в яких зустрічається слово “Hello”. Результат запишіть в test.out. Для роботи з файлами використовуйте функції cstdio.
6.В файлі test.in записано текст англійською мовою. Запишіть в файл test.out всі рядки з файлу test.in, в яких зустрічається слово “Hello”. Результат запишіть в test.out. Для роботи з файлами використовуйте функції fstream.
7.В файлі test.in записано текст англійською мовою. Замініть всі входження слова “Hello” на слово “World”. Результат запишіть в test.out. Для роботи з файлами використовуйте функції cstdio.
8.В файлі test.in записано текст англійською мовою. Замініть всі входження слова “Hello” на слово “World”. Результат запишіть в test.out. Для роботи з файлами використовуйте функції fstream.
9.В файлі test.in записано текст англійською мовою. Змініть регістр алфавітних символів. (Приклад: “Hello, World!” стане “hELLO, wORLD!”). Результат запишіть в test.out. Для роботи з файлами використовуйте
функції cstdio.
10. В файлі test.in записано текст англійською мовою. Змініть регістр алфавітних символів. (Приклад: “Hello, World!” стане “hELLO, wORLD!”). Результат запишіть в test.out. Для роботи з файлами використовуйте функції fstream.
75
Комп’ютерний практикум №5 Робота з файлами
Завдання середнього рівня
1. Створіть програму, що буде видаляти з лістингу програми на мові С++ (файл *.cpp) коментарі виду /* коментар */. Для роботи з файлами використовуйте функції cstdio.
2. Створіть програму, що буде видаляти з лістингу програми на мові С++ (файл *.cpp) коментарі виду /* коментар */. Для роботи з файлами використовуйте функції fstream.
3. Створіть програму, що буде видаляти з лістингу програми на мові С++ (файл *.cpp) коментарі виду // коментар. Для роботи з файлами використовуйте функції cstdio.
4. Створіть програму, що буде видаляти з лістингу програми на мові С++ (файл *.cpp) коментарі виду // коментар. Для роботи з файлами використовуйте функції fstream.
5. Створіть програму, що буде видаляти в текстовому файлі символироздільники (пробіл, символ табуляції) в кінці строк. Для роботи з файлами використовуйте функції cstdio.
6. Створіть програму, що буде видаляти в текстовому файлі символироздільники (пробіл, символ табуляції) в кінці строк. Для роботи з файлами використовуйте функції fstream.
7. Створіть програму, що буде підраховувати частоти монограм (байтів) в бінарному файлі. Який байт найчастіше зустрічається в текстовому файлі (*.txt)? Виконуваному файлі (*.exe)? Для роботи з файлами використовуйте функції cstdio.
8. Створіть програму, що буде підраховувати частоти монограм (байтів) в бінарному файлі. Який байт найчастіше зустрічається в текстовому файлі (*.txt)? Виконуваному файлі (*.exe)? Для роботи з файлами використовуйте функції fstream.
9. Створіть програму, що буде підраховувати ентропію за Шенноном бінарного файлу ($H = - \sum_{i=0}^{255} f_i \log f_i$, де $f_i$ -- частота входження байту $i$). Знайдіть ентропію документу Word (*.doc) та архіву (*.zip). Для роботи з файлами використовуйте функції cstdio.
10. Створіть програму, що буде підраховувати ентропію за Шенноном бінарного файлу ($H = - \sum_{i=0}^{255} f_i \log f_i$, де $f_i$ -- частота входження байту $i$). Знайдіть ентропію документу Word (*.doc) та архіву (*.zip). Для роботи з файлами використовуйте функції fstream.
11. Створіть програму, що буде в текстовому файлі переводити символи табуляції в пробіли (символ табуляції переводить курсор вперед на позицію кратну 8). Для роботи з файлами використовуйте функції cstdio.
76
Комп’ютерний практикум №5 Робота з файлами
12. Створіть програму, що буде в текстовому файлі переводити символи табуляції в пробіли (символ табуляції переводить курсор вперед на позицію кратну 8). Для роботи з файлами використовуйте функції fstream.
13. Створіть програму, що буде в текстовому файлі переводити пробіли в символи табуляції (символ табуляції переводить курсор вперед на позицію кратну 8). Для роботи з файлами використовуйте функції cstdio.
14. Створіть програму, що буде в текстовому файлі переводити пробіли в символи табуляції (символ табуляції переводить курсор вперед на позицію кратну 8). Для роботи з файлами використовуйте функції fstream.
15. Створіть программу пошуку входження строки в бінарному файлі. Чи входить строка ‘This program’ у виконуваний файл Вашої програми (*.exe)? Для роботи з файлами використовуйте функції cstdio.
16. Створіть программу пошуку входження строки в бінарному файлі. Чи входить строка ‘This program’ у виконуваний файл Вашої програми (*.exe)? Для роботи з файлами використовуйте функції fstream.
17. Створіть програму, що буде знаходити всі текстові строки довжиною більше 5 символів в бінарному файлі. Для роботи з файлами використовуйте функції cstdio.
18. Створіть програму, що буде знаходити всі текстові строки довжиною більше 5 символів в бінарному файлі. Для роботи з файлами використовуйте функції fstream.
19. Створіть програму, що буде виводити шістнадцятковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в шістнадцятковій системі). Для роботи з файлами використовуйте функції cstdio.
20. Створіть програму, що буде виводити шістнадцятковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в шістнадцятковій системі). Для роботи з файлами використовуйте функції fstream.
21. Створіть програму, що буде виводити вісімковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в вісімковій системі). Для роботи з файлами використовуйте функції cstdio.
22. Створіть програму, що буде виводити вісімковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в вісімковій системі). Для роботи з файлами використовуйте функції fstream.
23. Створіть програму, що буде виводити десятковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в десятковій системі). Для роботи з файлами використовуйте функції cstdio.
77
Комп’ютерний практикум №5 Робота з файлами
24. Створіть програму, що буде виводити десятковий дамп бінарного файлу (замість кожного байту вхідного файлу виводиться значення в десятковій системі). Для роботи з файлами використовуйте функції fstream.
Завдання підвищеної складності
1.Створіть програму, що підраховує частоти біграмм у бінарному файлі. Що таке біграмма можна прочитати в додатковій літературі [А.П.Алферов, А.Ю.Зубов, А.С.Кузьмин, А.В.Черемушкин "Основы криптографии"].
2.Створіть програму, що підраховує частоти входження слів в текстовому файлі.
3.Створіть програму, що підраховує частоти N-грамм (N > 2) у бінарному файлі. Більш детально про статистичний аналіз в криптографії, N-грами можна дізнатися в додатковій літературі [А.П.Алферов, А.Ю.Зубов, А.С.Кузьмин, А.В.Черемушкин "Основы криптографии"].
5.3.Контрольні запитання
1.Які засоби роботи з файлами є в мові С++?
2.Які існують методи відкриття файлів?
78
Комп’ютерний практикум №6 Робота з рядками
Комп’ютерний практикум №6 Робота з рядками
Мета роботи: отримати навички роботи з рядками засобами бібліотеки
STL С++ та C.
6.1. Теоретичні відомості
Простір імен
Простір імен (namespace) — це елемент мови С++, призначений для розв'язання конфліктів імен у програмах, що складаються з декількох файлів. Оголошення простору імен здійснюється наступним чином.
namespace [ідентифікатор]
{
// опис робочої області
}
Звернутися до ідентифікатору, що належить деякому простору імен, можна за допомогою оператора розширення контексту ::. Якщо виникає необхідність часто звертатися до ідентифікаторів з певного простору імен, зручно використовувати конструкцію using namespace. Це дозволяє уникнути необхідності використання простору імен при кожному зверненні, наприклад:
using namespace [ідентификатор]
Приклад 6.1. Оголошення та використання декількох просторів імен
#include <iostream> using namespace std;
namespace spaceA
{
int MyVal=10;
}
79
Комп’ютерний практикум №6 Робота з рядками
namespace spaceB
{
int MyVal=20;
}
namespace spaceC
{
int MyVal=30;
}
void Test()
{
using namespace spaceB;
cout << MyVal << " " << "spaceB" << endl;
}
int main()
{
using namespace spaceA;
cout << MyVal << " " << "spaceA" << endl; Test();
cout << spaceC::MyVal << " " << "spaceC" << endl; return 0;
}
Рядки в С++
В бібліотеці STL С++ є дуже корисна бібліотека роботи з рядками. Вона досить ефективна і дозволяє легко вирішувати наступні задачі:
1.Створювати, присвоювати, копіювати і видаляти рядки.
2.Виконувати перетворення типів символьних змінних.
3.Порівнювати рядки.
4.Поєднувати рядки.
5.Визначати довжину рядка.
6.Знаходити і заміщати потрібний фрагмент у рядку.
Для використання рядків, необхідно підключити відповідний заголовний
файл <string>. Після цього, операція створення нового рядка виявиться настільки ж простою, як і створення змінної будь-якого базового типу.
80
