- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
8.1.4. Неформатоване двійкове введення-виведення
Текстові файли зручні для сприйняття, однак більш гнучку структуру мають двійкові (бінарні) файли. Такі файли призначені для неформатованого введення-виведення, що здійснюється за допомогою функцій: put(), get(), getline(), а також write() і read().
Побайтове введення-виведення. Функція get() зчитує один байт із потоку й передає його значення аргументу s, а функція put()записує символ s у потік і повертає посилання на потік:
istream &get (char &s);
ostream &put (char s);
Блокове введення-виведення. Функція read() зчитує з потоку стільки байтів, скільки задано в аргументі num, і передає їх у буфер, який визначений покажчиком buf. Функція write() вилучає num байтів з буфера buf і записує їх у потік.
istream &read (char *buf, num);
ostream &write (const char *buf, num);
Рядкове введення. Функція getline() зчитує з потоку символи й передає їх у буфер buf доти, поки не буде зчитано (num-1) символів, або не зустрінеться символ нового рядка:
istream &getline (char *buf, num);
Відкриття й закриття бінарних файлів здійснюється точно так само, як і текстових файлів.
Приклад зчитування двійкового файлу:
int main(){
char ch;
ifstream in("test", ios::in | ios::binary);
if(!in) {cout << "Can't open file\n";
return 1; }
while(!in.eof()) {in.get(ch);
cout << ch; }
in.close();
return 0; }
Приклад запису із клавіатури у двійковий файл. Введення символів у файл припиняється при натисканні клавіші #.
int main(){
char ch;
ofstream out("test", ios::out | ios::binary);
if(!out) {cout << "Can't open file\n";
return 1; }
cout<<"For ending input #\n";
do {cout << ": ";
cin.get(ch);
out.put(ch);
} while (ch!='#');
out.close();
return 0; }
Приклад відкриття й зчитування текстового файлу. Можливе відкриття текстового файлу в бінарному режимі. Цей приклад ілюструє, як функції, призначені для роботи із двійковими файлами, можуть бути використані для операцій з текстовими файлами.
int main () {
char c, str[256];
ifstream is;
cout << "Enter the name of an existing file: ";
cin.get (str,256);
is.open (str); // Відкрити файл
while (is.good()){ //Почати цикл, якщо немає помилок
c = is.get(); //Взяти символ з файлу
cout << c; } //Вивести символ на екран
is.close();
return 0; }
Функція good() повертає true, якщо відсутні помилки при відкритті файлу.
Приклад блокового введення-виведення. Запис файлу в пам'ять.
int main () { int length;
char * buffer;
ifstream is;
is.open ("test", ios::binary );
is.seekg (0, ios::end); //Визначення
length = is.tellg(); //довжини файлу
is.seekg (0, ios::beg);
buffer = new char [length];
is.read (buffer,length); //Читання даних блоку
is.close();
cout.write (buffer,length);
return 0; }
8.1.5. Файли довільного доступу
Система введення-виведення С++ дозволяє створювати файли, що складаються із записів фіксованої довжини. Це забезпечує легкий пошук інформації при довільному доступі до файлу. Довільний доступ реалізується за допомогою потокових функцій введення й виведення: seekg() і seekp().
Для пошуку запису задається початок відліку (прапорці ios::beg, ios::end або ios::cur) і зсув покажчика відносно початку відліку. Наприклад, функція seekg(120,ios::beg) установлює покажчик зчитування файлу в позицію, що відстоїть на 120 байтів від початку файлу. А функція seekp(8,ios::end) установлює покажчик запису в позицію, що відстоїть на 8 байт від кінця файлу.
Файли довільного доступу повинні відкриватися в режимі операцій для двійкових файлів. Визначити поточну позицію кожного із двох покажчиків можна за допомогою функцій tellg() (повертає позицію покажчика зчитування) tellp() (повертає позицію покажчика запису).
Приклад. Заміна символу в зазначеній позиції.
int main () {
char * buffer;
fstream in;
in.open ("test.txt", ios::in|ios::out|ios::binary );
in.seekp(2,ios::beg); //Установка покажчика запису
in.put('r'); //Заміна символу
in.close();
return 0; }
Приклад зчитування певного рядка таблиці. Нехай створений файл довільного доступу, що містить таблицю, що складається з рядків-записів. Довжина кожного запису визначається зміною length. Код, що забезпечує зчитування другого запису, виглядає як:
char ch;
in.unsetf(ios::skipws); //Не пропускати пробіли
in.seekg(length,ios::beg);//Зчитування, починаючи з 2-го рядка
for (;;){in >> ch;
//Припинення зчитування наступних рядків
if (in.tellg()>2*length) break;
cout << ch; }