iDog's Interview C++ Part 6 
 Stream, I/O 
 Stream  
One principal goal of streams is to encapsulate the problems of getting the data to and from the disk or the screen. Once a stream is created, your program works with the stream and the stream takes care of the details. 
-  streambuf - manages buffer 
 -  ios - base class of input/output stream classes, containing a streambuf object. 
 -  istream & ostream - derived from ios 
 -  iostream - derived from istream & ostream, with functions for writing to screen. 
 -  fstream - file IO. 
 -  sstream - string IO.
 
 Standard I/O Objects  
When a C++ program that includes the iostream classes starts, following four objects (and also the 'w' versions of them) are created and initialized: 
-  cin - input from keyboard 
 -  cout - output to screen 
 -  cerr - output to screen, unbuffered 
 -  clog - buffered error messages to screen. It's common to redirect it to a log file. 
 
The difference between cerr and clog is that cerr is unbuffered, while clog is buffered. Also, a corresponding wide character version for each of the above four stream classes is provided:
cin
cin regards spaces as seperators. 
cin.get(char&) return a character from input stream: 
cin.get(c1).get(c2).get(c3); 
cin.get(c1, 256, '\n');  // get max 256 chars, seperated by '\n' (default seperator).
                         // Termination char is kept. 
cin.getline(c1, 256); // termination char is discarded. 
cin.ignore(80, '\n'); // ignores 80 chars until get a new line. 
                      // NL char will be discarded. 
cin.peek() // look at the next char without extracting it 
cin.putback(c1); // insert a char in cin. 
cout
Flush cout: any one of the follows. 
cout.flush(); 
cout << flush; 
cout.put(char): write a char to cout 
cout.put('a').put('b'); 
cout.write(char*, count); 
// #include <iomanip>
cout.width(count); // modify the width of the next output 
cout.fill(char)  // use the given char to fill if the object is not 
                 // as wide as the width set by function cout.width().
// Eg:
cout.width(5);
cout.fill('*');
cout << 12;
// shows: "***12" (without quotation marks)
Set flags of stream object
cout.setf(flag);
where flag can be:
-  ios::showpoint - show trailing zeros
 -  ios::showpos - show '+' for positive numbers
 -  ios::left, ios::right, ios::internal - alignment
 -  ios::dec, ios::oct, ios::hex
 
these flags can also be concatenated into the insertion operator:
cout << setw(10) << hex << 20;
clog:
Usage: redirect it to a log file:
ofstream out("my.log");
if(out)
    clog.rdbuf(out.rdbuf());
clog << "aaaaaaaa" << endl;
 File I/O 
Header file: <fstream>
ofstream ofs(filename, flag);
Flags:
-  ios::app - append
 -  ios::at - put file pointer at the end of file, but data can be written at anywhere in the file
 -  ios::trun - default value. existing file truncated (cleared)
 -  ios::nocreate - if file does not exist, then the open fails
 -  ios::noreplac - if file already exists, then the open fails
 
ifstream ifs(filename, flag);
Anything (including objects) can be written to a binary file by using cout.write((char*)obj, size) function; it then can be recovered by using cin(refOfObj, size) function.
MyObj myObj(0);
ofstream ofs("aaa", ios::binary);
ofs.write((char*)myObj, sizeof(myObj));
ofs.close(100);
MyObj myObj1;
ifstream ifs("aaa", ios::binary);
ifs.read(myObj1, sizeof(myObj1);
ifs.close();
 String Stream 
Use sstream to convert data to or from string.
#include <sstream>
using namespace std;
int main()
{
    stringstream ss1("123");
    int i;
    ss1 >> i;    // parse string to int
    cout << i << endl;
    stringstream ss2;
    ss2 << "output: " << i;  // convert int to string
    cout << ss2.str() << endl;
    return 0;
}