Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++_навч_пос14_new.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.86 Mб
Скачать

3.30 Створення функції-маніпулятора

#include <iostream.h>

#include <iomanip.h>

//функція-маніпулятор my_manip,

//яка отримує і повертає посилання на потоковий об’єкт класу ostream

ostream& my_manip(ostream& s)

{

s.width(10);//установити ширину поля

s.precision(4);//установити точність

s.setf(ios::showpos);//установити флаг: показувати основу

return s;//повернути s

}

void main()

{

cout<<my_manip<<16.0124<<endl;//виклик маніпулятора my_manip

}

3.31 Перевантаження операторів потокового вводу-виводу

#include <iostream.h>

class A//клас A

{

double a;

public:

A(double ia):a(ia){};

//оголошення дружньої операторної функції operator<<

friend ostream& operator<<(ostream &os, A obj);

};

//перевантаження операторної функції operator<<,

//яка отримує посилання на потоковий об’єкт класу ostream, об’єкт класу A

//і повертає посилання на потоковий об’єкт класу ostream

ostream& operator<<(ostream &os, A obj)

{

os.precision(2);//установити точність

os.setf(ios::showpos);//установити флаг форматування

os<<obj.a;//помістити a в потоковий об’єкт os

return os;//повернути os

}

void main()

{

A obj(2.125);//створити об’єкт класу A

//помістити obj в потік виводу, використовуючи перевантажений оператор <<

cout<<obj;

}

3.32 Клас рядкових потоків

#include <iostream.h>

#include <strstream.h>//бібліотека класу рядкових потоків

#include <string.h>

void main()

{

const char s[]="hello";

strstream out;//створити рядковий потоковий об’єкт out класу strstream

out<<s;//помістити в потік out рядок s

cout<<out.rdbuf()<<endl;//вивести вміст рядкового буферу

}

3.33 Бінарні файли

#include <iostream.h>

#include <fstream.h>//бібліотека класів файлового потокового вводу-виводу

void main()

{

//створити файловий об’єкт бінарного вводу f1, зв'язати з файлом 1.txt

ifstream f1("1.txt", ios_base::binary);

//створити файловий об’єкт бінарного виводу f2, зв'язати з файлом 2.txt

ofstream f2("2.txt", ios_base::binary);

char c;

while (!f1.eof())//поки не кінець файлу f1 повторювати цикл

{

f1.get(c);//читати символ з f1

if (f1) f2.put(c);//якщо f1, записати символ у f2

}

f1.close();//закрити файл f1

f2.close();//закрити файл f2

}

3.34 Бінарні файли прямого доступу

#include <fstream.h>//бібліотека класів файлового потокового вводу-виводу

#include <conio.h>

#include <iostream.h>

//структура для запису у бінарний файл

struct My

{

char C[20];

int N;

};

//перевантажений оператор << для виводу вмісту структури

ostream& operator<< (ostream &s, const My &x)

{

return s << x.C << ";" << x.N;

}

void main()

{

My s1={"string 1",1};//перший екземпляр

My s2={"string 2",2};//другий екземпляр

My s3={"string 3",3};//третій екземпляр

My s4={"string 4",4};//четвертий екземпляр

//створити файловий об’єкт для потокового виводу

ofstream ofile("file.dat", ios::binary);

//записати у файл екземпляри у вигляді рядків розміром My

ofile.write((char*)&s1, sizeof(My));

ofile.write((char*)&s2, sizeof(My));

ofile.write((char*)&s3, sizeof(My));

ofile.write((char*)&s4, sizeof(My));

ofile.close();//закрити файл ofile

//створити файловий об’єкт для потокового вводу

ifstream ifile("file.dat", ios::binary);

//читати з файлу екземпляри у вигляді рядків розміром My поки не кінець файлу

while (ifile.read((char*)&s1, sizeof(My)), !ifile.eof())

{

//якщо s1.C="string 2" вивести вміст екземпляра

if (!strcmp(s1.C,"string 2")) cout<<s1<<endl;//виклик перевантаженого оператора <<

}

ifile.close();//закрити файл ifile

//створити файловий об’єкт для потокового вводу

ifstream ifile2("file.dat", ios::binary);

//установити позицію у файлі на третій запис від початку

ifile2.seekg(sizeof(My)*2,ios::beg);

ifile2.read((char*)&s1, sizeof(My));//читати дані

//вивести вміст екземпляра

cout<<s1<<endl;//виклик перевантаженого оператора <<

ifile2.close();//закрити файл ifile2

getch();//очікувати вводу з клавіатури

}