Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Програмування. Структурний підхід (КПІ)

.pdf
Скачиваний:
44
Добавлен:
07.03.2016
Размер:
1 Мб
Скачать
☆

Комп’ютерний практикум №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