In this lesson, we’ll talk more about std::cout, which we used in our Hello world! program to output the text Hello world! to the console. We’ll also explore how to get input from the user, which we will use to make our programs more interactive.
The input/output library
The input/output library (io library) is part of the C++ standard library that deals with basic input and output. We’ll use the functionality in this library to get input from the keyboard and output data to the console. The io part of iostream stands for input/output.
To use the functionality defined within the iostream library, we need to include the iostream header at the top of any code file that uses the content defined in iostream, like so:
std::cout
The iostream library contains a few predefined variables for us to use. One of the most useful is std::cout, which allows us to send data to the console to be printed as text. cout stands for “character output”.
As a reminder, here’s our Hello world program:
In this program, we have included iostream so that we have access to std::cout. Inside our main function, we use std::cout, along with the insertion operator (<<
), to send the text Hello world! to the console to be printed.
std::cout can not only print text, it can also print numbers:
This produces the result:
4
It can also be used to print the value of variables:
This produces the result:
5
To print more than one thing on the same line, the insertion operator (<<
) can be used multiple times in a single statement to concatenate (link together) multiple pieces of output. For example:
This program prints:
Hello world!
Here’s another example where we print both text and the value of a variable in the same statement:
This program prints:
x is equal to: 5
std::endl
What would you expect this program to print?
You might be surprised at the result:
Hi!My name is Alex.
Separate output statements don’t result in separate lines of output on the console.
If we want to print separate lines of output to the console, we need to tell the console when to move the cursor to the next line.
One way to do that is to use std::endl. When output with std::cout, std::endl prints a newline character to the console (causing the cursor to go to the start of the next line). In this context, endl stands for “end line”.
For example:
This prints:
Hi! My name is Alex.
Tip
In the above program, the second std::endl isn’t technically necessary, since the program ends immediately afterward. However, it serves a few useful purposes.
First, it helps indicate that the line of output is a “complete thought” (as opposed to partial output that is completed somewhere later in the code). In this sense, it functions similarly to using a period in standard English.
Second, it positions the cursor on the next line, so that if we later add additional lines of output (e.g. have the program say “bye!”), those lines will appear where we expect (rather than appended to the prior line of output).
Third, after running an executable from the command line, some operating systems do not output a new line before showing the command prompt again. If our program does not end with the cursor on a new line, the command prompt may appear appended to the prior line of output, rather than at the start of a new line as the user would expect.
Best practice
Output a newline whenever a line of output is complete.
std::endl vs ‘\n’
Using std::endl can be a bit inefficient, as it actually does two jobs: it moves the cursor to the next line of the console, and it makes sure that any cached output shows up on the screen immediately (this is called flushing the output). When writing text to the console using std::cout, std::cout often flushes output anyway (and if it doesn’t, it usually doesn’t matter), so having std::endl perform a flush is rarely important.
Because of this, use of the ‘\n’ character is typically preferred instead. The ‘\n’ character moves the cursor to the next line of the console, but doesn’t request a flush, so it will perform better in cases where a flush would not otherwise happen. The ‘\n’ character also tends to be easier to read since it’s both shorter and can be embedded into existing text.
Here’s an example that uses ‘\n’ in two different ways:
This prints:
x is equal to: 5 And that's all, folks!
Note that when ‘\n’ is used by itself to move the cursor to the next line of the console, the single quotes are needed. When embedded into text that is already double-quoted, the single quotes aren’t needed.
We’ll cover what ‘\n’ is in more detail when we get to the lesson on chars (4.11 -- Chars).
Best practice
Prefer ‘\n’ over std::endl when outputting text to the console.
Warning
‘\n’ uses a backslash (as do all special characters in C++), not a forward slash. Using a forward slash (e.g. ‘/n’) instead may result in unexpected behavior.
std::cin
std::cin
is another predefined variable that is defined in the iostream
library. Whereas std::cout
prints data to the console using the insertion operator (<<
), std::cin
(which stands for “character input”) reads input from keyboard using the extraction operator (>>
). The input must be stored in a variable to be used.
Try compiling this program and running it for yourself. When you run the program, line 5 will print “Enter a number: “. When the code gets to line 8, your program will wait for you to enter input. Once you enter a number (and press enter), the number you enter will be assigned to variable x. Finally, on line 10, the program will print “You entered ” followed by the number you just entered.
For example (I entered 4):
Enter a number: 4 You entered 4
This is an easy way to get keyboard input from the user, and we will use it in many of our examples going forward. Note that you don’t need to use ‘\n’ when accepting input, as the user will need to press the enter key to have their input accepted, and this will move the cursor to the next line of the console.
Just like it is possible to output more than one bit of text in a single line, it is also possible to input more than one value on a single line:
This produces the output:
Enter two numbers separated by a space: 5 6 You entered 5 and 6
Best practice
There’s some debate over whether it’s necessary to initialize a variable immediately before you give it a user provided value via another source (e.g. std::cin), since the user-provided value will just overwrite the initialization value. In line with our previous recommendation that variables should always be initialized, best practice is to initialize the variable first.
For advanced readers
The C++ I/O library does not provide a way to accept keyboard input without the user having to press enter. If this is something you desire, you’ll have to use a third party library. For console applications, we’d recommend pdcurses, FXTUI, or cpp-terminal. Many graphical user libraries have their own functions to do this kind of thing.
Summary
New programmers often mix up std::cin, std::cout, the insertion operator (<<
) and the extraction operator (>>
). Here’s an easy way to remember:
std::cin
andstd::cout
always go on the left-hand side of the statement.std::cout
is used to output a value (cout = character output)std::cin
is used to get an input value (cin = character input)<<
is used with std::cout, and shows the direction that data is moving (ifstd::cout
represents the console, the output data is moving from the variable to the console).std::cout << 4
moves the value of 4 to the console>>
is used withstd::cin
, and shows the direction that data is moving (if std::cin represents the keyboard, the input data is moving from the keyboard to the variable).std::cin >> x
moves the value the user entered from the keyboard into x
Question #1
Consider the following program that we used above:
The
program expects you to enter an integer value, as the variable x that
the user input will be put into is an integer variable.