Skillversitas

Basic Input and Output in C++

Input/Output (I/O) is a fundamental part of every program — programs need to receive data from users and display results to users. C++ provides a powerful Standard Library for I/O through the <iostream> header, which contains objects such as cin, cout, cerr, and clog. In this tutorial, we will learn how to perform basic input and output with various data types.


The C++ Stream Model

C++ uses a stream model for I/O operations. A stream is an abstraction of a data flow that can be read (input stream) or written (output stream).

Input → [istream] → Program → [ostream] → Output
                  <iostream>
  • cin — Standard input stream (usually the keyboard)
  • cout — Standard output stream (usually the screen/terminal)
  • cerr — Standard error stream (error output, unbuffered)
  • clog — Standard log stream (log output, buffered)

Code Example

#include <iostream>
#include <string>

using namespace std;

int main() {
    // Basic output with cout
    cout << "=== Basic Input Output Program ===" << endl;

    // String input with cin >>
    string name;
    cout << "Enter name: ";
    cin >> name;
    cout << "Hello, " << name << "!" << endl;

    // Integer input
    int age;
    cout << "Enter age: ";
    cin >> age;
    cout << "Your age: " << age << " years" << endl;

    // Float and double input
    float height;
    double weight;
    cout << "Enter height (meters): ";
    cin >> height;
    cout << "Enter weight (kg): ";
    cin >> weight;
    cout << "Height: " << height << " m, Weight: " << weight << " kg" << endl;

    // Character input
    char grade;
    cout << "Enter grade (A-F): ";
    cin >> grade;
    cout << "Grade: " << grade << endl;

    // Input multiple values
    int a, b;
    cout << "Enter two numbers: ";
    cin >> a >> b;
    cout << "Sum: " << a + b << endl;

    // Input with getline for multi-word strings
    cin.ignore(); // Clear the buffer
    string address;
    cout << "Enter complete address: ";
    getline(cin, address);
    cout << "Address: " << address << endl;

    return 0;
}

Code Explanation

1. cout << — Standard Output

cout is an ostream object used to write output to the terminal. The << operator (insertion operator) sends data to the output stream.

// Simple output
cout << "Hello, World!" << endl;

// Output with chaining (combining several outputs)
string name = "John";
int age = 25;
cout << "Name: " << name << ", Age: " << age << endl;

// Output without endl (using \n)
cout << "First line\n";
cout << "Second line\n";

// Output of several lines
cout << "Name: " << name << "\n"
     << "Age: " << age << "\n"
     << "Status: Active" << endl;

Data types supported by cout:

cout << 42 << endl;              // int
cout << 3.14 << endl;            // double
cout << 'A' << endl;             // char
cout << "Hello" << endl;         // const char*
cout << true << endl;            // bool
cout << string("World") << endl; // std::string

2. cin >> — Standard Input

cin is an istream object used to read input from the keyboard. The >> operator (extraction operator) takes data from the input stream.

// Reading a single value
int number;
cin >> number;

// Reading multiple values (separated by space/enter)
int a, b, c;
cin >> a >> b >> c;

// Reading various data types
string name;
int age;
double height;
cin >> name >> age >> height;

Behavior of cin >>:
- Waits for input from the user (blocking)
- Ignores whitespace (spaces, tabs, newlines)
- Stops reading when it encounters whitespace
- Converts the input to the appropriate data type

3. getline() — Reading a Complete String

cin >> only reads up to the first whitespace. To read a string that contains spaces, use getline():

// getline reads the entire line up to the newline
string fullName;
cout << "Enter full name: ";
getline(cin, fullName);
cout << "Full name: " << fullName << endl;

// getline with a custom delimiter
string word;
getline(cin, word, ',');  // Read up to a comma

Common Problem with cin >> before getline():

When cin >> reads input, the newline character (\n) remains in the buffer. getline() will read that newline as an empty string.

// The problem
int age;
string name;
cin >> age;         // The user types "25" + Enter
getline(cin, name); // getline reads the leftover newline → name is empty!

// Solution: use cin.ignore()
int age;
string name;
cin >> age;
cin.ignore();        // Discard the newline from the buffer
getline(cin, name);  // Now it works correctly

4. cerr — Standard Error Output

cerr is used to display error messages. cerr output is not buffered (it is displayed immediately).

#include <iostream>
#include <string>

using namespace std;

int main() {
    int number;
    cout << "Enter a number: ";
    cin >> number;

    if (cin.fail()) {
        cerr << "Error: Input is not a valid number!" << endl;
        return 1;
    }

    cout << "You entered: " << number << endl;
    return 0;
}

5. clog — Standard Log Output

clog is similar to cerr, but its output is buffered. It is suitable for logging that does not need to be displayed immediately.

clog << "Starting process..." << endl;
clog << "Reading data from file..." << endl;
clog << "Process complete." << endl;

Difference Between endl and \n

// Using endl
cout << "Hello" << endl;
cout << "World" << endl;

// Using \n
cout << "Hello\n";
cout << "World\n";
Aspect endl \n
Newline Yes Yes
Flush buffer Yes (forces writing to the screen) No
Speed Slower Faster
Ideal usage When logging errors / debug output Normal output

Recommendations:
- Use \n for normal output (more efficient)
- Use endl when you need to make sure the output is displayed immediately (for example, before a crash or in an error message)


The Left Operator (<<) vs the Right Operator (>>)

// cout << → Insertion operator (left to right)
cout << "Value: " << 42 << endl;

// cin >> → Extraction operator (right to left)
int x;
cin >> x;  // Read from cin into the variable x

Why is it cin >> x and not cin << x?

The >> operator on cin means "extract from the stream into the variable," while the << on cout means "insert from the variable into the stream." The direction of data flow determines the operator.


Everyday Use Cases

Simple Calculator Program

#include <iostream>

using namespace std;

int main() {
    double number1, number2;
    char operation;

    cout << "=== Simple Calculator ===" << endl;
    cout << "Enter first number: ";
    cin >> number1;
    cout << "Enter operator (+, -, *, /): ";
    cin >> operation;
    cout << "Enter second number: ";
    cin >> number2;

    double result;

    switch (operation) {
        case '+':
            result = number1 + number2;
            break;
        case '-':
            result = number1 - number2;
            break;
        case '*':
            result = number1 * number2;
            break;
        case '/':
            if (number2 != 0) {
                result = number1 / number2;
            } else {
                cerr << "Error: Division by zero!" << endl;
                return 1;
            }
            break;
        default:
            cerr << "Error: Invalid operator!" << endl;
            return 1;
    }

    cout << "\n=== Result ===" << endl;
    cout << number1 << " " << operation << " " << number2 << " = " << result << endl;

    return 0;
}

Student Data Input Program

#include <iostream>
#include <string>

using namespace std;

int main() {
    string name, studentId, address;
    int semester;
    double gpa;

    cout << "=== Student Data Form ===" << endl;

    cout << "Student ID: ";
    getline(cin, studentId);

    cout << "Full name: ";
    getline(cin, name);

    cout << "Semester: ";
    cin >> semester;

    cout << "GPA: ";
    cin >> gpa;

    cin.ignore();
    cout << "Address: ";
    getline(cin, address);

    cout << "\n=== Student Data ===" << endl;
    cout << "ID       : " << studentId << endl;
    cout << "Name     : " << name << endl;
    cout << "Semester : " << semester << endl;
    cout << "GPA      : " << gpa << endl;
    cout << "Address  : " << address << endl;

    return 0;
}

Input Validation

#include <iostream>
#include <limits>

using namespace std;

int main() {
    int choice;

    do {
        cout << "\n=== Main Menu ===" << endl;
        cout << "1. View Data" << endl;
        cout << "2. Add Data" << endl;
        cout << "3. Delete Data" << endl;
        cout << "0. Exit" << endl;
        cout << "Choice: ";
        cin >> choice;

        // Validate the input
        if (cin.fail()) {
            cin.clear();  // Reset error flag
            cin.ignore(numeric_limits<streamsize>::max(), '\n');  // Discard the buffer
            cerr << "Invalid input! Enter a number." << endl;
            continue;
        }

        switch (choice) {
            case 1:
                cout << "Displaying data..." << endl;
                break;
            case 2:
                cout << "Adding data..." << endl;
                break;
            case 3:
                cout << "Deleting data..." << endl;
                break;
            case 0:
                cout << "Exiting the program." << endl;
                break;
            default:
                cout << "Choice not available!" << endl;
        }
    } while (choice != 0);

    return 0;
}

I/O Error Handling

Checking Stream Status

#include <iostream>
#include <limits>

using namespace std;

int main() {
    int number;

    cout << "Enter a number: ";

    // Check whether the input succeeded
    if (cin >> number) {
        cout << "You entered: " << number << endl;
    } else {
        cerr << "Error: Input is not a number!" << endl;

        // Reset stream state
        cin.clear();

        // Discard invalid input from the buffer
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    return 0;
}

Using fail(), bad(), eof()

#include <iostream>

using namespace std;

int main() {
    int number;

    cout << "Enter a number: ";
    cin >> number;

    if (cin.eof()) {
        cout << "End of file reached." << endl;
    } else if (cin.bad()) {
        cerr << "Fatal error on stream." << endl;
    } else if (cin.fail()) {
        cerr << "Invalid input (type mismatch)." << endl;
        cin.clear();
        cin.ignore(10000, '\n');
    } else {
        cout << "Input successful: " << number << endl;
    }

    return 0;
}

I/O Objects Summary

Object Type Function Buffer
cin istream Standard input (keyboard) Buffered
cout ostream Standard output (screen) Buffered
cerr ostream Error output (screen) Unbuffered
clog ostream Log output (screen) Buffered

Required Headers

#include <iostream>   // cin, cout, cerr, clog
#include <string>     // std::string, getline()
#include <limits>     // numeric_limits (for cin.ignore())

Conclusion

C++ provides the cin object for input and cout/cerr/clog for output through the <iostream> header. The << operator is used for output to cout, while the >> operator is used for input from cin. Use getline() to read strings that contain spaces, and cin.ignore() to clear the buffer after cin >>. endl inserts a newline and also flushes the buffer, while \n only inserts a newline without flushing. Validating input is very important for robust programs — use cin.fail(), cin.clear(), and cin.ignore() to handle invalid input.