Search

1.5 — Introduction to iostream: cout, cin, and endl

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 iostream library

The iostream 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 two useful purposes: First, it helps indicate that the line of output is a “complete thought”. Second, if we later want to add additional output statements, we don’t have to modify the existing code. We can just add them.

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, and it “flushes” the output (makes sure that it shows up on the screen immediately). When writing text to the console using std::cout, std::cout usually flushes output anyway (and if it doesn’t, it usually doesn’t matter), so having std::endl 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, but doesn’t do the redundant flush, so it performs better. 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, the single quotes are needed. When embedded into another bit of text, the single quotes aren’t needed.

We’ll cover what ‘\n’ is in more detail when we get to the lesson on chars (D.2.7 -- 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 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, it will print “Enter a number: ” and then wait for you to enter one. Once you enter a number (and press enter), it 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.

If your screen closes immediately after entering a number, please see lesson 0.8 -- A few common C++ problems for a solution.

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 initialized, best practice is to initialize the variable first.

We’ll discuss how std::cin handles invalid input in a future lesson.

For advanced readers

The C++ iostream 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 the pdcurses library. 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 and std::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 (if std::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 with std::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

We'll talk more about operators in lesson 1.8 -- Introduction to literals and operators.

Quiz time

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.

Run this program multiple times and describe what happens when you enter the following types of input instead:

a) A letter, such as h

Show Solution

b) A number with a fractional component. Try numbers with fractional components less than 0.5 and greater than 0.5 (e.g. 3.2 and 3.7).

Show Solution

c) A small negative integer, such as -3

Show Solution

d) A word, such as Hello

Show Solution

e) A really big number (at least 3 billion)

Show Solution

The last suggestion may be particularly surprising. Try it! This happens because x can only hold numbers up to a certain size. After that, it "overflows". We'll discuss overflow in a future lesson.


1.6 -- Uninitialized variables and undefined behavior
Index
1.4 -- Variable assignment and initialization

209 comments to 1.5 — Introduction to iostream: cout, cin, and endl

  • Rohan

    To compile you code in Mac

  • I tried this on mac (which uses clang in stead of gcc even if you call for gcc or g++, maybe that's what causes this???)

    I used multi code blocks to make sure the c++ code line numbers would remain correct all the time. I just copied the code above, no alterations. Now if I replace "int x{ };" with "int x = 0;" the code compiles without errors. Since I've already been coding for ages, maybe I went too quickly though some compiler config chapters and missed something, or is something else the matter?

    ( Hey, C and C++ are pretty new for me. Up until now I used Lua, BlitzMax, Pascal, Go and C#, hahaha! )

    (NOTE! And for some reason, the code blocks in my comment don't work anymore after editing this message. Is that a bug? nvm-Renewing the page "fixed" that issue).

    • Supplement, now I've been playing around with this, and it appears that the c++ compiler on mac simply deems {} for variable definition unacceptable.

      The code above compiled and works

      And when I compile this I get this error:

      I'm personally not very fond of using ( and ) for a variable value definition, as I might easily confuse them for functions, but using { and } and having to pray I'm using a compiler that accepts them is also not a very charming solution :(

      • Alex

        It sounds like your compiler may not be C++11-compatible, or if it is, that option might be turned off.

        • I see... I was already looking in version issues so I tried "g++ --version" and I got this:

          EDIT: I've found this on stackoverflow and there I saw the advice to use this to compile on Mac:

          I tried this and that appears to be working.... Perhaps this is good to know for other Mac users using this tutorial

          • Hi Jeroen!

            When compiling with g++ or clang++ (Probably more), one should specify the standard version. This should be addressed in lesson 0.7 @Alex.
            C++11 is already 8 years old, clang 9 has partial support for C++20, use that.

            All the other options enable more warnings and disable compiler extensions as recommended in lesson 0.10 and 0.11.
            Compiling manually will become tedious when you have lots of files. Once you get there I recommend you looking into CMake.

            • Ah, thank you for that information.
              I know that C and C++ have a lot of typing work for compiling when it handles big complex projects, so I have been looking at MAKE already and I will also investigate CMAKE... And I guess I should make note of that way you called clang++ there ;)

  • delFlaco

    The work "use" is missing in the "The iostream library" part at the top:
    We’ll ... the function...
    also:
    "at the top any code" - missing the word "of"?

  • Eccentric Song

    Hi Alex,
    I've just started my adventure with C++ and wanted to shout out just how much I appreciate your work on this site. The first three chapters updating yesterday was a surprise, to be sure, but a welcome one - and I immidiately went on to revieving the updated material. That said (and finally moving on to the true purpose of this rant), I believe I've spotted a typo:
    "We’ll the functionality in this library to get input from the keyboard and output data to the console."
    To my understading the beginning should be:
    "We'll be using the functionality..." or something along those lines.

    Thank you again for this great tutorial, keep up the great work!

  • vito

    Is std::cout considered an l-value here? And what about std::cin

  • Stoil

    Hi, i tried putting this code in Visual Studio but it keeps giving me an error ("fatal error LNK1168: cannot open C:\Users\ASRock\source\repos\Project3\Debug\Project3.exe for writing")
    It still works if i skip this step, though

Leave a Comment

Put all code inside code tags: [code]your code here[/code]