Streams¶
Easy to locate in a one-demension line, which flows in a single direction.
Kinds of streams¶
Kinds of streams
(i) text streams
-
readable
-
organized in lines
(ii) binary streams
if we do
./a.out > 1 // hello in 1, Byebye in terminal
./a.out 2> 1 // Byebye in 1, hello in termial
./a.out >1 2> 2 // hello in 1, Byebye in 2
int get()
, a member function, returns the next character in the stream, EOF if no character left. istream& get(char& ch)
, a manipulator.
use free function instead of object
// recommended
istream& getline(istream& is, string& str, char delim='\n') // delim is the end sign
// not recommended, you need to create an array,
cin.getline(char *, int size)
ignore(int limit=1, int delim=EOF)
, a member function, skip over limit
number character or until delim
. Like skipping until the end of line, or let wrong string to be read, such that program could continue.
int gcount()
returns number of characters just read.
cin.putback(char)
pushes a single character into a stream
char peek()
examines next character without reading it.
flush
forces content in ostream to output.
Manipulators¶
Manipulators modify the state of the stream.
Manipulator | effect | type |
---|---|---|
dec, hex, oct | set numberic conversion | I,O |
endl | insert new line and flush | O |
flush | flush stream | O |
setw(int) | set field width | I,O |
setfill(char) | change fill character(like # ) |
I,O |
setbase(int) | set number base(like 2) | I,O |
ws | skip whitespace | I |
setprecision(int) | set floating point precision | O |
#include <iomanip>
int n;
cout << "enter number in hexadecimal" << flush; // only takes effect once
cin >> hex >> n; // effexts hold
#include <iostream>
#include <ismanip>
main(){
cout << setprecision(2) << 1000.243 << endl;
cout << setw(10) << "OK!";
}
// returns
1e03
OK!
we can create our own manipulator.
ostream& manip(ostream& out){
...
return out;
}
ostream& tab (ostraam& out){
return out << '\t';
}
cout << "Hello" << tab << "world"<< endl;
Stream flags¶
// set amnd reset using manipulators
setiosflags(flags) // set '1'
resetiosflag(flags) // reset '0'
// using `stream` member function
cin.setf(flags)
cout.unsetf(flags)
main(){
// add two functions
cout.setf(ios::showpos | ios::scientific);
cout << 123 << " " << 456.78 <<endl;
cout << resetiosflags(ios::showpos) << 123;
return 0;
}
// output
+123 +4.567800e+02
123
clear()
returns error stream to GOOD, which is useful for reading failure.
checking status:
good()
, eof
, fail()
, bad()
return true or false.
int n;
while(cin.good()){// skip if eof or bad
cin >> n;
if(cin){ // overload operator bool() cin, cin.put
cin,ignore(INT_MAX, '\n');
break;
}
if(cin.fail()){
cin.clear();
cin,ignore(INT_MAX, '\n');
cout << "No good, try again!" << flush;
}
}
File streams¶
In <fstream>
, ifstream
, ofstream
connects files to streams.
Open modes specify how to create files using flags.
modes | purpose |
---|---|
ios::app | append |
ios::ate | position at the end |
ios::binary | do binary I/O |
ios::in | open for input |
ios::out | open for output |
#include <iostream>
#include <fstream>
int main(int argc, char *argv[]){
if(argc !=3){
cerr << "Usage: copy file1 file2" <<endl;
exit(1);
}
ifstream in(argv[1]);
if(! in){
cerr << "Unable to open file " << argv[1];
exit(2);
}
ofstream out(argv[2]);
if(! out){
cerr << "Unable to open file " << argv[];
exit(2);
}
}
more stream operations like open(const char *, int flags, int)
to open a specified file, close()
to close a stream.