Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практика.docx
Скачиваний:
11
Добавлен:
09.06.2015
Размер:
79.45 Кб
Скачать

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

В C++ операции ввода-вывода выполняются при помощи потоков данных. Согласно принципам объектно-ориентированного программирования, поток данных представляет собой объект, свойства которого определяется классом. Вывод интерпретируется как запись данных в поток, а ввод — как чтение данных из потока. Для стандартных каналов ввода-вывода существуют стандартные глобальные объекты. [1]

Ниже приведён листинг программы, демонстрирующий использование потоков ввода-вывода.

#include <iostream>

#include <vector>

#include <fstream>

#include <string>

#include <sstream>

using namespace std;

/*функция, считывающая целые числа из потока ввода и копирующая их в вектор*/

void readVector(vector<int> &v, istream &in) {

v.clear();

int a;

while (in>>a){

v.push_back (a);

}

}

/*функция, записывающая целые числа из вектора в поток вывода*/

void printVector(vector<int> &v, ostream &out) {

for (vector<int>::iterator iter=v.begin(); iter != v.end(); ++iter){

out<<*iter << " ";

}

out << endl;

}

int main ()

{

vector<int> vec;

/*заполнение вектора, в качестве аргумента передаётся cin*/

cout<<"enter vector: ";

readVector(vec, cin);

/*вывод элементов вектора в поток cout*/

printVector(vec, cout);

/*заполнение вектора, в качестве аргумента передаётся файловый

поток fin*/

ifstream fin("input_task2.txt");

readVector(vec, fin);

fin.close();

/*вывод элементов вектора в файловый поток fout*/

ofstream fout("output.txt");

printVector(vec, fout);

fout.close();

/*передача строки в строковый поток ввода*/

istringstream sstr_in("23 56 56 45 64 23 34");

readVector(vec, sstr_in);

/*вывод элементов вектора в строковый поток и вывод строки в поток

cout*/

ostringstream sstr_out;

printVector(vec, sstr_out);

cout << "string: " << sstr_out.str();

if (true) return 0;

}

Содержимое входного файла:

1990 2000 2010 2020 2030 2040 2050

Содержимое файла output.txt:

1990 2000 2010 2020 2030 2040 2050

Результат работы программы:

enter vector: 1 2 3^D

1 2 3

string: 23 56 56 45 64 23 34

8. Итераторы

Итераторы призваны предоставлять доступ к членам контейнеров, они могут быть использованы способом, похожим на манипуляции указателями. Например, можно использовать итератор для прохода по всем элементам вектора. Есть несколько разных типов итераторов:

  • input_iterator (для чтения). Читают значения с движением вперед. Могут быть инкрементированы, сравнены и разыменованы.

  • output_iterator (для записи). Пишут значения с движением вперед. Могут быть инкрементированы и разыменованы.

  • forward_iterator (однонаправленные). Читают или пишут значения с движением вперед. Комбинируют функциональность предыдущих двух типов с возможностью сохранять значение итератора.

  • bidirectional_iterator (двунаправленные). Читают и пишут значения с движением вперед или назад. Похожи на однонаправленные, но их также можно инкрементировать и декрементировать.

  • random_iterator (с произвольным доступом). Читают и пишут значения с произвольным доступом. Самые мощные итераторы, сочетающие функциональность двунаправленных итераторов и возможность выполнения арифметики указателей и сравнений указателей.

  • reverse_iterator (обратные). Или итераторы с произвольным доступом, или двунаправленные, движущиеся в обратном направлении.

Каждый класс контейнеров связан с типом итератора, и каждый из алгоритмов STL использует определенный тип итератора.

Например, векторы связаны с итераторами с произвольным доступом, значит, они могут использовать алгоритмы, требующие произвольного доступа. Так как итераторы с произвольным доступом включают в себя все свойства других итераторов, то векторы также могут использовать алгоритмы, написанные для других итераторов. [7]

Ниже представлен листинг программы, которая содержит алгоритмы, использующие разные типы итераторов.

#include <iostream>

#include <iterator>

#include <algorithm>

#include <vector>

#include <fstream>

using namespace std;

int main ()

{

vector <int> vec;

ifstream in("input_task2.txt");

while (!in.eof()){

int x;

in>>x;

vec.push_back (x);

}

in.close();

/*copy() использует InputIterator и OutputIterator для считывания

из потока и зпаиси в поток*/

copy (istream_iterator<int>(cin), istream_iterator<int>(),

ostream_iterator <int>(cout, " "));

ofstream out("output.txt");

out<<"vector:\n";

for (vector <int>::iterator iter = vec.begin (); iter != vec.end();

++iter){

out<<*iter<<" ";

}

/*max_element использует input iterator*/

vector<int>::iterator max_it = max_element(vec.begin (),

vec.end());

out<<"\n\ninput iterator\nmax: "<<*max_it<<"\n\n";

/*generate_n использует output iterator*/

vector <int> vec_temp(vec);

generate_n(vec_temp.begin (), vec_temp.size(), rand);

out<<"output iterator\ngenerate rand():\n";

for (vector <int>::iterator iter = vec_temp.begin (); iter !=

vec_temp.end(); ++iter){

out<<*iter<<" ";

}

/*fill использует forward iterator*/

out<<"\n\nforward iterator:\nfill():\n";

fill (vec_temp.begin (), vec_temp.end(), 1);

for (vector <int>::iterator iter = vec_temp.begin (); iter !=

vec_temp.end(); ++iter){

out<<*iter<<" ";

}

/*reverse использует bidirectional iterator*/

out<<"\n\nbidirectional iterator:\n"<<"reverse():\n";

vector <int> vec_temp1(vec);

reverse (vec_temp1.begin(), vec_temp1.end());

for (vector <int>::iterator iter = vec_temp1.begin (); iter !=

vec_temp1.end(); ++iter){

out<<*iter<<" ";

}

/*random_shuffle использует random access iterator*/

out<<"\n\nrandom access iterator:\n";

random_shuffle (vec.begin(), vec.end ());

for (vector <int>::iterator iter = vec.begin (); iter != vec.end();

++iter){

out<<*iter<<" ";

}

out.close();

return 0;

}

Содержимое входного файла:

1990 2000 2010 2020 2030 2040 2050

Результат работы программы:

vector:

1990 2000 2010 2020 2030 2040 2050

input iterator

max: 2050

output iterator

generate rand():

41 18467 6334 26500 19169 15724 11478

forward iterator:

fill():

1 1 1 1 1 1 1

bidirectional iterator:

reverse():

2050 2040 2030 2020 2010 2000 1990

random access iterator:

2030 2010 1990 2000 2020 2040 2050