Поточный ввод-вывод в C++ : функции cin, cout, cerr

Поточный ввод-вывод в C++

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

В С для этих целей используется библиотека stdio.h. В С++ разработана новая библиотека ввода-вывода iostream, использующая концепцию объектно-ориентированного программирования:

 
#include <iostream>

Библиотека iostream определяет три стандартных потока:

  • cin  стандартный входной поток (stdin в С)
  • cout  стандартный выходной поток (stdout в С)
  • cerr  стандартный поток вывода сообщений об ошибках (stderr в С)

Для их использования в Microsoft Visual Studio необходимо прописать строку:

 
using namespace std;

В противном случае каждый вызов функций cin, cout будет дополняться пространством имен std и оператором разрешения контекста ::

 
 
std::cin >> Имя;
std::cout << Имя;

Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:

  • >>  получить из входного потока
  • <<  поместить в выходной поток

Вывод информации

 
cout << значение;

Здесь значение преобразуется в последовательность символов и выводится в выходной поток:

 
cout << n;

Возможно многократное назначение потоков:

 
cout << "значение1" << "значение2" << ... << "значение n";

 
 
 
 
int n;
char j;
cin >> n >> j;
cout << "Значение n равно" << n << "j=" << j;

Ввод информации

 
>cin >> идентификатор;

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

 
 
int n;
cin >> n;

Возможно многократное назначение потоков:

 
cin >> переменная1 >> переменная2 >>...>> переменнаяn;

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

 
 
 
int n;
char j;
cin >> n >> j;

Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.

Пример

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
  char s[80];
  cin >> s;
  cout << s << endl;
  system("pause");
  return 0;
}

Результат выполнения

Для ввода текста до символа перевода строки используется манипулятор потока getline():

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
  char s[80];
  cin.getline(s, 80);
  cout << s << endl;
  system("pause");
  return 0;
}

Результат выполнения

Ввод текста

Манипуляторы потока

Функцию — манипулятор потока можно включать в операции помещения в поток и извлечения из потока (<<, >>).

В С++ имеется ряд манипуляторов. Рассмотрим основные:

Манипулятор Описание
endl Помещение в выходной поток символа конца строки '\n'
dec Установка основания 10-ой системы счисления
oct Установка основания 8-ой системы счисления
hex Установка основания 16-ой системы счисления
setbase Вывод базовой системы счисления
width(ширина) Устанавливает ширину поля вывода
fill('символ') Заполняет пустые знакоместа значением символа
precision(точность) Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed
fixed Показывает, что установленная точность относится к количеству знаков после запятой
showpos Показывает знак + для положительных чисел
scientific Выводит число в экспоненциальной форме
get() Ожидает ввода символа
getline(указатель, количество) Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество

Пример Программа ввода-вывода значения переменной в C++

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
  int n;
  cout << "Введите n:";
  cin >> n;
  cout << "Значение n равно: " << n << endl;
  cin.get(); cin.get();
  return 0;
}

Та же программа, написанная на языке Си

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  int n;
  printf("Введите n:");
  scanf("%d", &n);
  printf("Значение n равно: %d\n", n);
  getchar(); getchar();
  return 0;
}

Пример Использование форматированного вывода

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
int main()
{
  double a = -112.234;
  double b = 4.3981;
  int c = 18;
  cout << endl << "double number:" << endl;
  cout << "width(10)" << endl;
  cout.width(10);
  cout << a << endl << b << endl;
  cout << "fill('0')" << endl;
  cout.fill('0');
  cout.width(10);
  cout << a << endl << b << endl;
  cout.precision(5);
  cout << "precision(5)" << endl << a << endl << b << endl;
  cout << "fixed" << endl << fixed << a << endl << b << endl;
  cout << "showpos" << endl << showpos << a << endl << b << endl;
  cout << "scientific" << endl << scientific << a << endl << b << endl;
  cout << endl << "int number:" << endl;
  cout << showbase << hex << c << " " << showbase << oct << c << " ";
cout << showbase << dec << c << endl;
cin.get();
return 0;
}

Результат выполнения

Форматированный вывод

Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main()
{
  cout << fixed;
  for (double t = 0; t <= 3; t += 0.5) 
  {
    cout.width(3);
    cout.precision(1);
    cout << t;
    cout.width(8);
    cout.precision(3);
    cout << cos(t) << endl;
  }
  system("pause");
  return 0;
}

Результат выполнения

Форматированный вывод
Прокрутить вверх