Chapter 9 Input and Output

In this chapter, we will learn how to take in input from the user, and output/print data to the screen. C++ handles this using the notion of streams. In particular, we will focus on two standard streams: the input stream cin for receiving input, and the output stream cout for displaying output. In order to make use of these streams, we must include the iostream header file at the start of our program. One thing to keep in mind while reading this section is that C++ makes input and output very easy. In particular, we do not need to worry about whether our input or output is an integer, a float or a string—C++ handles that for us automatically. By contrast, Python requires us to manually ensure that the input is of the correct type.

We will be using the string data type in many examples in this chapter. Because string is not a built-in data type, we should in theory need to include it by writing #include <string> at the top of our files. However, it turns out that all C++ compilers have iostream libraries that themselves include string. Thus when we include iostream, we are also conveniently including string as well.

9.1 Output

The iostream library contains the cout stream, which we can use to send data to be displayed as text in the terminal. Let’s look at our simple Hello, world! program again and see what’s going on.

#include <iostream>

using namespace std; //use standard definitions

int main(){ //bracket signals the start of the main function
         cout << "Hello, world!";
         return 0; 
}

First off, note that we include iostream at the very beginning so that we can use the cout stream. Then on Line 6, we print some text to the console. We do this by using the cout stream and the insertion operator (<<). Note how the insertion operator is like two arrows pointing towards the stream. This essentially tell the program to send what is on the right-hand side (in this case, the text) to the stream, which then handles displaying it in the terminal.

Note that cout can print more than just text—it can print numbers and variables too, as in the example below:

int x = 10;
cout << 5;
cout << x; // prints the value of x to console

In order to print more than one thing on the same line, we can use the insertion operator multiple times in a single statement to concatenate multiple pieces of output:

string name = "David";
cout << "Hello, " << name << "!"; // prints Hello, David!

By default, C++ does not print a new line at the end of these output statements. One way to achieve this is to use endl, which is also contained in the iostream library, and forces the stream to print a new line character. For example:

string name = "David";
cout << "Hello, " << name << "!" << endl;
cout << "My name is HAL" << endl;

In the above example, everything would appear on the same line if we did not include endl. The same effect can be had by including the newline character \n in the text as so:

string name = "David";
cout << "Hello, " << name << "!\n";
cout << "My name is HAL\n";

9.2 Input

Having looked at output, input is very similar. In order to accept input from the keyboard, we now use the cin stream, which again is defined in the iostream header file. Whereas cout prints data to the terminal using the insertion operator,cin reads input from the keyboard using the extraction operator (>>). The input must be stored in a variable to be used, as follows:

int age; //we must create a variable to store input
cin >> age; // read in data and store in age
cout << "Wow, you are " << age <<"! You old!" << endl;

To remember the extraction operator, notice how it looks like two arrows pointing towards the variable that will hold the input. A fantastic feature of C++ is that input works the same regardless of the type being read in. In Python, if we wanted to read in an integer, we would need to write x = int(input()). Similarly, a float is read in x = float(input()). By contrast, C++ handles this automatically, as in the example below:

int x;
double y; //recall that double is for real numbers
string z;
cin >> x;
cin >> y;  
cin >> z; // C++ handles the types for us!

We can also chain together input statements on a single line to read in multiple values:

string name;
int age;
cin >> name >> age; //will read in a string, then an int

9.2.1 String Input

An important detail about input in C++ is that it will read all the characters up to the first whitespace it encounters. This whitespace could be a regular space, or a newline, but C++ will only accept input up to this point. For reading strings, this means that C++ only reads one word at a time. Let’s look at this using the example below:

#include <iostream>

using namespace std;

int main(){
        string firstName; 
        cin >> firstName;
        cout << "Hello, " << firstName << endl;
        return 0;
}

If I were to try enter both my first and last name, separated by a space, only my first name would be read and stored in the variable. My surname would be waiting in the input stream for another read to occur. If we want to accept both the first name and surname, we can achieve this by modifying our program to look like this:

#include <iostream>

using namespace std;

int main(){
    string firstName; 
    string surname;
    cout << "Please enter your first and surname" << endl;
    cin >> firstName >> surname; //input first name and surname
    string fullName = firstName + " " + surname; //concatenate
    cout << "Hello, " << fullName << endl; //output message and name
    return 0;
}

If we want to read in an entire line, including any whitespaces, we can use the getline function like so:

#include <iostream>

using namespace std;

int main(){
    string name; 
    cout << "Please enter your full name" << endl;
    getline(cin, name); //reads ENTIRE LINE into name
    cout << "Hello, " << name << endl;
    return 0;
}

Note however, that mixing getline and cin can cause subtle errors, so try avoid this where possible.

Finally, we present code that asks the user to input their first name and year of birth and then displays the user’s first name and age:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string firstName;
    cout << "Please enter your first name" << endl;
    cin >> firstName; //input first name
    int yearOfBirth;
    cout << "Please enter your year of birth" << endl;
    cin >> yearOfBirth;
    int age = 2018 - yearOfBirth;
    cout << "Hello, " << firstName << endl; //output message and name
    cout << "Your age is " << age << endl; //output message and age
    return 0;
}

9.3 Summary Lecture