Вывод данных в языке C++

Для вывода данных в языке C++ предназначены объекты cout, cerr и clog, объявленные в файле iostream. Объект cout (console output — вывод на консоль) используется для вывода обычных сообщений в окно консоли. Объекты cerr и clog применяются для вывода сообщений об ошибках. Также как и объект cout объекты cerr и clog первоначально связаны с окном консоли, однако возможно перенаправить поток на другое устройство или в файл. Для понимания всех возможностей этих объектов требуется знание принципов объектно-ориентированного программирования (ООП). Так как ООП мы еще не изучали, в этом разделе будут рассматриваться только основные возможности объектов. В последующих главах мы вернемся к изучению этих объектов.

Прежде чем использовать объекты, необходимо подключить файл iostream с помощью директивы #include:

#include <iostream>

Обратите внимание на то, что название файла указывается внутри угловых скобок без расширения, так как файл iostream входит в состав стандартной библиотеки C++. После подключения файла все объекты будут доступны через пространство имен std, поэтому при обращении к объекту необходимо указать название пространства имен и два символа двоеточия перед названием объекта. Например, вывести строку Hello, world! можно так:

std::cout << "Hello, world!";

Вывести сообщение об ошибке можно так (в окне Console редактора Eclipse такие сообщения отображаются красным цветом):

std::cerr << "Error 1";
std::clog << "Error 2";

Если каждый раз указывать название пространства имен лень, то можно импортировать все идентификаторы в глобальное пространство имен с помощью инструкции:

using namespace std;

В этом случае название пространства имен указывать не нужно:

cout << "Hello, world!";

Хотя это очень удобно, следует избегать импортирования всех идентификаторов в глобальное пространство имен, так как возможен конфликт имен. Вместо этого способа лучше импортировать определенные идентификаторы. Например, импортировать только объект cout можно так:

using std::cout;

После названия объекта указывается оператор <<, который как бы задает направление вывода. При разработке собственных объектов можно перегрузить этот оператор и тем самым управлять выводом. После оператора << передается значение, которое будет выведено в окне консоли. В качестве значения можно указать число, строку, а также объект, в классе которого оператор << перегружен. Пример:

std::cout << 10;                // Целое число
std::cout << 81.5;              // Вещественное число
std::cout << "Hello, world!";   // Строка
char str[] = "Hello, world!";
std::cout << str;               // Строка

Результат выполнения этого примера будет таким:

1081.5Hello, world!Hello, world!

Как видно из результата, все данные выводятся на одной строке. Чтобы данные выводились на отдельных строках можно воспользоваться константой endl (сокращение от end line). Пример:

std::cout << "String1";
std::cout << std::endl;
std::cout << "String2";

Результат в окне консоли:

String1
String2

На самом деле endl не совсем константа. Можно сказать, что это функция (называемая манипулятором), внутри которой производится вывод символа перевода строки, сбрасывается буфер, а затем возвращается ссылка на поток вывода. Благодаря возврату ссылки можно строить цепочки из операторов <<. Например, предыдущий пример можно записать так:

std::cout << "String1" << std::endl << "String2";

Для перевода строки можно также воспользоваться комбинацией символов \n, которая обозначает символ перевода строки. Пример:

std::cout << "String1" << '\n' << "String2";

Для вывода строк, состоящих из двухбайтовых символов, предназначены объекты wcout, wcerr и wclog, объявленные в файле iostream. Объект wcout предназначен для вывода обычных сообщений, а объекты wcerr и wclog для вывода сообщений об ошибках (для вывода сообщений на русском языке следует предварительно настроить локаль):

// #include <clocale>
std::setlocale(LC_ALL, "Russian_Russia.1251"); // Настройка локали
std::wcout << L"String";
std::wcerr << L"Error 1";
std::wclog << L"Error 2";

С помощью стандартного вывода можно создать индикатор выполнения процесса в окне консоли. Чтобы реализовать такой индикатор нужно вспомнить, что символ перевода строки в Windows состоит из двух символов \r (перевод каретки) и \n (перевод строки). Таким образом, используя только символ перевода каретки \r можно перемещаться в начало строки и перезаписывать ранее выведенную информацию. Пример индикатора процесса показан в листинге 2.5.

Листинг 2.5. Индикатор выполнения процесса

#include <iostream>
#include <windows.h>

int main() {
   std::cout << "... 0%";
   for (int i = 5; i < 101; i += 5) {
      Sleep(1000); // Имитация процесса
      std::cout << "\r... " << i << "%";
      std::cout.flush();
   }
   std::cout << std::endl;
   return 0;
}

Открываем командную строку (в редакторе Eclipse эффекта не будет видно), компилируем программу и запускаем:

C:\book>g++ -Wall -Wconversion -O3 -o helloworld.exe helloworld.cpp

C:\book>helloworld.exe

Эта программа немного сложнее, чем простое приветствие из листинга 2.1. Здесь присутствует имитация процесса с помощью функции Sleep() (при этом программа «засыпает» на указанное количество миллисекунд). Прототип функции:

#include <windows.h>
VOID Sleep(DWORD dwMilliseconds);

Тип данных DWORD объявлен так:

typedef unsigned __LONG32 DWORD;
#define __LONG32 long

Кроме того, в программе использован цикл for, который позволяет изменить порядок обработки инструкций. Обычно программа выполняется слева направо и сверху вниз. Инструкция за инструкцией. Цикл for меняет эту последовательность выполнения. Инструкции, расположенные внутри блока, выполняются несколько раз. Количество повторений зависит от выражений внутри круглых скобок. Этих выражений три, и разделены они точками с запятой. Первое выражение объявляет целочисленную переменную i и присваивает ей значение 5. Второе выражение является условием продолжения повторений. Пока значение переменной i меньше значения 101, инструкции внутри блока будут повторяться. Это условие проверяется на каждой итерации цикла. Третье выражение на каждой итерации цикла прибавляет значение 5 к текущему значению переменной i.

Так как данные перед выводом могут помещаться в буфер, вполне возможно потребуется сбросить буфер явным образом. Сделать это можно с помощью метода flush():

std::cout.flush();

Или с помощью функции fflush(). Прототип функции:

#include <cstdio> /* или #include <stdio.h> */
int fflush(FILE *stream)

В качестве параметра указывается стандартный поток вывода stdout:

std::fflush(stdout);

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов