1.8.  Streams

[ fromfile: streams.xml id: streams ]

Streams are objects used for reading and writing. The Standard Library defines <iostream>, while Qt defines <QTextStream> for the equivalent functionality.

iostream defines the three global streams:

Also defined in <iostream> are manipulators, such as flush and endl. Manipulators are implicit calls to functions that can change the state of a stream object in various ways. A manipulator can be a added to

Example 1.6 demonstrates the use of manipulators applied to the standard output stream.

Example 1.6. src/stdstreams/streamdemo.cpp

#include <iostream>

int main() {
    using namespace std;
    int num1(1234), num2(2345) ;
    cout << oct << num2 << '\t'
            << hex << num2 << '\t'
             << dec << num2 
             << endl;
    cout << (num1 < num2) << endl;
    cout << boolalpha
             << (num1 < num2)
             << endl;
    double dub(1357);
    cout << dub << '\t'
            << showpos << dub << '\t'
            << showpoint << dub 
            << endl;
    dub = 1234.5678;
    cout << dub << '\t'
            << fixed << dub << '\t'
            << scientific << dub << '\n'
            << noshowpos << dub 
            << endl;
}

Output:

4451 929 2345 1 true 1357 +1357 +1357.00 +1234.57 +1234.567800 +1.234568e+03 1.234568e+03

It is easy to define QTextStreams with the same names as their equivalent iostream counterparts. Since standard input and output streams are often used primarily for debugging purposes, Qt provides a global function, qDebug() that facilitates sending messages to stdout with a flexible interface that we demonstrate in Example 1.7.

Example 1.7. src/qtstreams/qtstreamdemo.cpp

#include <QTextStream>
#include <QDebug>

QTextStream cin(stdin, QIODevice::ReadOnly);
QTextStream cout(stdout, QIODevice::WriteOnly);
QTextStream cerr(stderr, QIODevice::WriteOnly);

int main() {
   int num1(1234), num2(2345) ;
    cout << oct << num2 << '\t'
            << hex << num2 << '\t'
             << dec << num2 
             << endl;
    double dub(1357);
    cout << dub << '\t'
            << forcesign << dub << '\t'
            << forcepoint << dub 
            << endl;
    dub = 1234.5678;
    cout << dub << '\t'
            << fixed << dub << '\t'
            << scientific << dub << '\n'
            << noforcesign << dub 
            << endl;
    qDebug() << "Here is a debug message with " << dub << "in it." ;
    qDebug("Here is one with the number %d in it.", num1 );
}

Output:

4451 929 2345 1357 +1357 +1357.00 +1234.57 +1234.567800 +1.234568e+03 1.234568e+03 Here is a debug message with 1234.57 in it. Here is one with the number 1234 in it.

The symbols stdin, stdout, and stderr come from the C standard library. Note that QTextStream also provides manipulators, some of which are spelled the same as the ones we used above with iostream.