Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЯзыки прогрИб.doc
Скачиваний:
27
Добавлен:
12.11.2019
Размер:
922.11 Кб
Скачать

11.2. Функции библиотеки потокового ввода/вывода

iostream.h

Потоком называется абстрактное понятие, относящееся к любому переносу данных от источника (или поставщика) к приемнику (или потребителю) данных. Также используются синонимы извлечение, прием и выборка, когда речь идет о вводе символов от источника, и вставка, помещение или запоминание, когда речь идет о выводе символов в приемник.

Базовая библиотека ввода/вывода потоков iostream обладает улучшенной гибкостью и элегантностью по сравнению с другими библиотеками ввода/вывода ,например, с stdio. Поэтому, настоятельно рекомендуем пользоваться этой библиотекой.

Потоковый ввод может применяться со стандартным входным потоком cin (клавиатура). Для выполнения ввода используется перегруженная операция ">>" - операция извлечения.

cin>>p; //p – переменная, выражение базовых типов.

С клавиатуры читается последовательность символов до пробела, преобразуется к типу p и помещается в p.

Потоковый вывод применяется со стандартным выходным потоком cout(экран дисплея). Для выполнения вывода используется перегруженная операция "<<" - операция вставки.

cout<< p;//p-переменная, выражение, константа базовых типов.

Значение p преобразуется в последовательность символов и выводится на экран.

Несколько операторов вывода с операцией вставки (<<) можно объединять в один (сцеплять). Тоже относится и к операции извлечения, но при вводе необходим разделитель-пробел.

Форматирование ввода/вывода в библиотеке iostream.h выполняется флагами форматирования и некоторыми функциями.

Перечислим флаги и поля форматирования:

- dec, oct, hex: вывод целых типов (десятичных, восьмеричных, шестнадцатиричных); поле – basefield;

- fixed, scientific: вывод вещественных типов (с фиксированной и плавающей точкой); поле – floatfield;

- left, right: прижим влево или вправо; поле – adjustfield;

- showbase: вывод целых чисел с системой счисления (0, 0х);

- showpoint: вывод вещественных чисел с десятичной точкой и хвостовыми нулями;

- showpos: вывод положительных чисел со знаком +;

- skipws: пропуск пробелов при вводе;

- uppercase: вывод прописных X и E.

Поле форматирования необходимо для альтернативных флагов, чтобы гарантировать установку только одного из флагов.

Перечислим функции форматирования:

- Установка флагов форматирования:

setf(flag) - для флагов без поля форматирования;

setf(flag,pole) - для флагов с полем форматирования.

Примеры:

cout.setf(ios::showpos);

cout.setf(ios::fixed,ios::floatfield);

cout.setf(ios::showpoint|ios::uppercase);//Несколько флагов

- Сброс флагов форматирования: unsetf(flag);

- Установка ширины поля вывода:

width(n) - устанавливает ширину поля n позиций и возвращает предыдущую ширину;

width() - только возвращает текущую ширину поля.

Пример:

cout.width(5);

cout<<123; //__123

cout<<456; //456 ширина поля сбросилась в ноль

- Установка символа-заполнителя:

fill(ch) - устанавливает символ-заполнитель ch и возвращает предыдущий;

fill() - только возвращает текущий символ-заполнитель. По умолчанию - пробел.

Пример:

cout.fill('*');

cout.width(5);

cout<<123; //**123

- Установка точности вещественных чисел:

precision(n) - устанавливает n цифр после точки и возвращает предыдущее значение;

precision() - только возвращает точность. По умолчанию точность равна 6 и хвостовые нули усекаются. Если после точки имеются только нули, то усекаются хвостовые нули и точка.

Пример:

cout.precision(2);

cout<<1.2345; //1.23

Альтернативным способом форматирования ввода/вывода является использование специальной операции (похожей на функцию), называемой манипулятором. Манипуляторы принимают в качестве аргумента ссылку на поток и возвращают ссылку на тот же поток. Поэтому, манипуляторы могут объединяться в цепочку вставок (или извлечений из потока). Например, запись:

cout<<setw(2)<<i<<setw(4)<<j; //setw – ширина поля

эквивалентна более длинной записи:

cout.width(2);

cout<<i;

cout.width(4);

cout<<j;

Перечислим манипуляторы:

dec – установка флага форматирования с десятичными преобразованиями;

oct - установка флага форматирования с восьмеричными преобразованиями;

hex - установка флага форматирования с шестнадцатеричными преобразованиями;

setw(n) - установка ширины поля n;

setprecision(n) - установка точности представления чисел n;

setfill(ch) - установка символа-заполнителя ch;

ws - извлечение пробелов при вводе;

endl - вставка символа новой строки и очистки потока(вывод);

ends - вставка конечного нулевого символа в строку(вывод);

setbase(n)-установка системы счисления при преобразованиях по основанию n (0, 8, 10, 16);

setiosflags(flag) - установка флагов форматирования flag;

resetiosflags(flag) - очистка флагов форматирования flag.

Манипуляторы могут быть записаны прямо в операциях ввода/вывода в виде цепочки. При использовании параметризированных манипуляторов необходимо включить в программу библиотеку iomanip.h .

Пример:

cout<<setw(7)<<setprecision(2)<<12.345<<endl; //__12.35

Основными средствами ввода/вывода библиотеки iostream.h являются операции вставки (<<) и извлечения (>>).

Помимо операций вставки и извлечения для ввода/вывода можно использовать функции.

- Ввод с клавиатуры символа: get(ch) - функция с параметром; get() - функция без параметра.

cin.get(ch);

ch=cin.get();

- Ввод с клавиатуры строки: get(),getline(),read().

cin.get(buf,n[,razd]);

cin.getline(buf,n[,razd]);

cin.read(buf,n);

,где buf - массив символов, n -количество символов, razd -символ-разделитель.

Функция get прекращает ввод, когда либо введено n-1 символов, либо встретился символ-разделитель razd, который не вводится, либо - символ конца файла. Отличие функции getline от get в том, что символ-разделитель razd тоже вводится.

- Вывод символа на экран: put(ch).

cout.put(ch);

- вывод строки на экран: write().

cout.write(buf.n);

Отличие этих функций от операций вставки и извлечения в том, что они не имеют средств форматирования и преобразования данных.

Для ввода с клавиатуры содержимого документов и вывода результатов задач на экран предпочтение лучше отдать операциям >> и <<. При вводе строки, имеющей внутри пробелы, операция извлечения (>>) введет только часть строки до первого пробела. В такой ситуации лучше использовать функции.

Контрольные вопросы

  1. Какие средства ввода/вывода имеет библиотека conio.h?

  2. Какие средства ввода/вывода имеет библиотека iostream.h?

  3. Что такое операции извлечения (>>) и вставки (<<)?

  4. Какие имеются способы форматирования ввода/вывода?

  5. Какие средства обработки файлов имеет библиотека потокового ввода/вывода fstream.h?