Программирование. Потоки ввода - вывода

Содержание

Слайд 2

Шаблоны. Родовые функции Шаблоны. Родовые классы. Потоки ввода-вывода. Файловые потоки ввода-вывода. Шаблоны. Потоки ввода-вывода

Шаблоны. Родовые функции
Шаблоны. Родовые классы.
Потоки ввода-вывода.
Файловые потоки ввода-вывода.

Шаблоны. Потоки ввода-вывода

Слайд 3

Шаблоны С помощью шаблонов можно создавать родовые функции и родовые классы.

Шаблоны

С помощью шаблонов можно создавать родовые функции и родовые классы.
В шаблонах

тип обрабатываемых данных задается как параметр (заранее не известен). Это позволяет использовать одну и ту же функцию или класс с разными типами данных.
Слайд 4

Шаблоны. Родовые функции Родовые функции определяют базовый набор операций, которые будут

Шаблоны. Родовые функции

Родовые функции определяют базовый набор операций, которые будут применяться

к разным типам данных.
При вызове родовая функция будет работать с тем типом данных, который она получит как параметр.
Родовая функция позволяет определить сущность некоторого алгоритма обработки данных без привязки к конкретному типу данных.
Слайд 5

Шаблоны. Родовые функции Родовая функция создается с помощью ключевого слова template

Шаблоны. Родовые функции

Родовая функция создается с помощью ключевого слова template и

называется шаблоном функции.
Формат определения шаблона:
template
тип_возвр_знач имя_функции (список_парам)
{ тело_функции }
T – это фиктивное имя типа данных (родовый тип данных), который компилятор автоматически заменяет именем реального типа данных при создании конкретного варианта функции.
Слайд 6

template void Swap(T& a, T& b) { T t; t =

template void Swap(T& a, T& b) {
T t;

t = a; a = b; b = t;
}
Слайд 7

template void Swap(T& a, T& b) { T t; t =

template void Swap(T& a, T& b) {
T t;

t = a; a = b; b = t;
}

int main() {
int i = 10, j = 20;
float x = 10.1, y = 20.2;
cout << "Before swap:" << endl;
cout << "i = " << i << ", j = " << j << endl;
cout << "x = " << x << ", y = " << y << endl;
cout << endl;
Swap(i, j);
Swap(x, y);
cout << "After swap:" << endl;
cout << "i = " << i << ", j = " << j << endl;
cout << "x = " << x << ", y = " << y << endl;
return 0;
}

Слайд 8

template void Swap(T& a, T& b) { T t; t =

template void Swap(T& a, T& b) {
T t;

t = a; a = b; b = t;
}
Слайд 9

Шаблоны. Родовые функции Вместо ключевого слова class можно использовать typename. Можно

Шаблоны. Родовые функции

Вместо ключевого слова class можно использовать typename.
Можно использовать несколько

родовых типов данных:
template
тип_возвр_знач имя_функции (список_парам)
{ тело_функции }
Родовые функции похожи на перегруженные функции. Но при перегрузке функций можно написать разные алгоритмы, а родовая функция определяет общий алгоритм.
Слайд 10

Шаблоны. Родовые функции template void print(T1 x, T2 y) { cout

Шаблоны. Родовые функции

template
void print(T1 x, T2 y)

{
cout << x << ' ' << y << endl;
}

int main() {
print(10, "hi");
print(0.2, 0x10000);
print('a', 1.5);
print(12, 5);
return 0;
}

Слайд 11

Шаблоны. Родовые классы Родовые классы содержат общую логику хранения и обработки

Шаблоны. Родовые классы

Родовые классы содержат общую логику хранения и обработки данных,

которую можно применять к объектам разного типа.
Формат объявления шаблона класса:
template
class имя_класса {
тело_класса
};
T – имя фиктивного типа данных. Конкретный тип будет определен при создании объекта класса.
Слайд 12

Шаблоны. Родовые классы Определение функций класса вне шаблона: template тип_возвр_знач имя_класса

Шаблоны. Родовые классы

Определение функций класса вне шаблона:
template
тип_возвр_знач имя_класса

:: имя_функции (список_парам) {тело_функции }
Функции-элементы родового класса автоматически становятся родовыми функциями.
Создание объекта класса на основе шаблона:
имя_класса <тип_данных> имя_объекта;
Слайд 13

template class List { T data; List* next; public: List(T d);

template
class List {
T data;
List* next;
public:
List(T d);

void add(List* node) {
node -> next = this;
next = 0;
}
List* getNext() { return next; }
T getData() { return data; }
};
template
List::List(T d) {
data = d;
next = 0;
}
Слайд 14

int main() { List start('a'); List *p, *last; last = &start;

int main() {
List start('a');
List *p, *last;
last = &start;

for(int i = 1; i < 26; i++) {
p = new List ('a'+i);
p -> add(last);
last = p;
}
p = &start;
while(p) {
cout << p -> getData();
p = p -> getNext();
}
cout << endl;
return 0;
}
Слайд 15

Слайд 16

class Point { float x, y; public: Point(float x = 0.0,

class Point {
float x, y;
public:
Point(float x = 0.0, float

y = 0.0) {
this -> x = x;
this -> y = y;
}
friend ostream& operator<< (ostream& out, Point& p);
};
ostream& operator<< (ostream& out, Point& p) {
out << '[' << p.x << ',' << p.y << ']' << endl;
return out;
}
Слайд 17

int main() { List start(Point(0, 0)); List *p, *last; last =

int main() {
List start(Point(0, 0));
List *p, *last;
last =

&start;
for(int i = 1; i < 26; i++) {
p = new List (Point(i/2.0, i));
p -> add(last);
last = p;
}
p = &start;
while(p) {
cout << p -> getData();
p = p -> getNext();
}
cout << endl;
return 0;
}
Слайд 18

Слайд 19

Потоки ввода-вывода В C++ имеется набор классов для управления вводом-выводом, использующий

Потоки ввода-вывода

В C++ имеется набор классов для управления вводом-выводом, использующий механизм

перегрузки операций.
Классы потоков:
ios – базовый класс ввода-вывода;
istream и ostream – потоки ввода и вывода соответственно, производные от ios;
iostream – комбинированный класс для ввода и вывода, производный от istream и ostream;
ifstream, ofstream, fstream – классы для управления файловым вводом-выводом.
Слайд 20

Потоки ввода-вывода Предопределенные объекты-потоки:

Потоки ввода-вывода

Предопределенные объекты-потоки:

Слайд 21

class Point { float x, y; public: Point(float x = 0.0,

class Point {
float x, y;
public:
Point(float x = 0.0, float

y = 0.0) {
this -> x = x;
this -> y = y;
}
friend ostream& operator << (ostream& out, Point& p);
friend istream& operator >> (istream& in, Point& p);
};
ostream& operator << (ostream& out, Point& p) {
out << '[' << p.x << ',' << p.y << ']' << endl;
return out;
}
istream& operator >> (istream& in, Point& p) {
in >> p.x >> p.y;
return in;
}
Слайд 22

int main() { Point p; cout cin >> p; cout return 0; }

int main() {
Point p;
cout << "Enter point coordinates: ";
cin >> p;
cout

<< "The point: " << p;
return 0;
}
Слайд 23

istream& operator >> (istream& in, Point& p) { char c; in

istream& operator >> (istream& in, Point& p) {
char c;
in

>> c;
if(c != '[') return in;
in >> p.x;
in >> c;
if(c != ',') return in;
in >> p.y;
in >> c;
return in;
}
Слайд 24

Файловые потоки ввода-вывода ifstream, ofstream, fstream – классы для управления файловым

Файловые потоки ввода-вывода

ifstream, ofstream, fstream – классы для управления файловым вводом-выводом.
Чтобы

работать с файловым потоком, нужен объект потока и открытый файл, связанный с ним.
Для закрытия файла нужно вызвать метод close() для объекта потока.
Деструктор потока автоматически закрывает файл при уничтожении объекта потока.
Слайд 25

Конструирование объекта потока Конструктор, создающий объект без открытия файла: ifstream(); ofstream();

Конструирование объекта потока

Конструктор, создающий объект без открытия файла:
ifstream(); ofstream(); fstream();
Конструктор, открывающий указанный файл

и связывающий его с потоком:
ifstream(const char* name,
int mode = ios::in,
long prot = 0666);
Конструктор, создающий объект и связывающий его с открытым файлом:
ifstream(int file);
Конструктор, создающий объект и связывающий его с открытым файлом и буфером:
ifstream(int file, char* buf, int len);
Слайд 26

Конструирование объекта потока Режимы открытия файла (параметр mode): ifstream(const char* name,

Конструирование объекта потока

Режимы открытия файла (параметр mode):
ifstream(const char* name, int mode,

long prot);
Значения параметра определены в классе ios:

Параметры можно комбинировать с помощью поразрядного «ИЛИ»

Слайд 27

#include #include using namespace std; class Point { float x, y;

#include
#include
using namespace std;
class Point {
float x, y;
public:
Point(float

x = 0.0, float y = 0.0);
friend ostream& operator << (ostream& out, Point& p);
friend istream& operator >> (istream& in, Point& p);
friend ofstream& operator << (ofstream& out, Point& p);
friend ifstream& operator >> (ifstream& in, Point& p);
};
Слайд 28

ofstream& operator out return out; } ifstream& operator >> (ifstream& in,

ofstream& operator << (ofstream& out, Point& p) {
out << '['

<< p.x << ',' << p.y << ']' << endl;
return out;
}
ifstream& operator >> (ifstream& in, Point& p) {
char c;
in >> c;
if(c != '[') return in;
in >> p.x;
in >> c;
if(c != ',') return in;
in >> p.y;
in >> c;
return in;
}
Слайд 29

int main() { Point p; cout cin >> p; char fileName[]

int main() {
Point p;
cout << "Enter point coordinates: ";

cin >> p;
char fileName[] = "points.txt";
fstream fs(fileName, ios::app|ios::binary);
fs << p;
fs.close();
fs.open(fileName, ios::in|ios::binary);
while(fs) {
fs >> p;
if(fs) cout << "The point: " << p;
}
fs.close();
return 0;
}