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

Язык C++ / Поточный ввод-вывод в C++

 

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

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

 
#include <iostream>


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

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

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

 
using namespace std;


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

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

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

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;
}


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

Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
}


Результат выполнения
Форматированный вывод


Назад: Язык C++

Комментариев к записи: 24

  • Спасибо за лаконичное и системное изложение этой и др. тем. Как здорово консультации в таком стиле экономят время и не засоряют голову чрезмерной информацией


  • Статья для русскоязычной аудитории. При попытке вывести текст новички столкнуться с тем, что выводится абра-кадабра и компилятор необходимо "обучить" русскому языку.А после "обучения", будет анти проблема - программа не будет понимать что ей вводят через cin.

    • Елена Вставская
      Решение проблемы с русским языком описано здесь: https://prog-cpp.ru/vs-console/

    • 1
      2
      3
      4
      int main()
      {
            setlocal(LC_ALL, "Russian");
      }
      и никаких проблем с CIN, COUT и вообще, это ключевые слова.

    • Только при setlocale(LC_ALL, "Russian"); ввод cin будет так же иероглифами. Можете использовать этот вариант в функции main() SetConsoleCP(1251); SetConsoleOutputCP(1251);

  • Алексей
    Если в cout записать некое математическое выражение (например cout << 45 + 36) то оно выполнится и выведется на экран уже решение. Как мне запросить у пользователя мат выражение и выполнить его в cout-e?

    • Елена Вставская
      Ввести строку, выделить в ней числа и знаки, вычислить и вывести


        • Елена Вставская
          Тогда и скобки выделить) Порядок выполнения операций можно отслеживать с помощью бинарного дерева. Каждая открывающая скобка опускает вычисления на 1 уровень вниз

      • Здравствуйте! Вы можете мне помочь решить эту задачу и дать ссылку на подробный материал на эту тему, и как можно больше примеров. Используя функции, управляющие форматом вывода данных, напишите программу, которая будет выводить строку "..........123". Вот, почта для связи yusubfaridrahim@yandex.ru

  • Можно ли привести нормальный пример ввода чисел с клавиатуры в изначально пустой vector (не указывая его первоначального размера)? Пересмотрел много примеров в интернете, сам пользуюсь Problem solving with C++ W.Savitch, ничего толкового не нашел.Только примеры с предварительным запросом кол-ва желаемого ввести. Спасибо заранее

    • Елена Вставская
      Для выделения памяти необходимо заранее знать количество элементов. Либо есть функция realloc, которая перевыделяет память: https://prog-cpp.ru/c-alloc/ Но при больших массивах это сильно нагружает программу, поскольку при каждом перераспределении происходит копирование всех элементов. Ещё один вариант - воспользоваться динамической структурой данных типа списка.


  • Для работы <iostream> не необходимо прописывать строку (using namespace std;)! Можно и желательно использовать вставку std:: (std::cout<<""<<std::endl;)


  • Анатолий
    ""Возможно многократное назначение потоков"
    Неясно. Что такое назначение потоков? Ведь потоки уже определены, а операция << есть помещение в поток.   Потому запись <<а <<b<<c есть последовательное помещение в поток.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *