Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Вывод данных в языке 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);
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов