1 Input/Output Stream Lesson #10 Note: CIS 601 notes were originally developed by H. Zhu for NJIT DL...
-
date post
21-Dec-2015 -
Category
Documents
-
view
213 -
download
0
Transcript of 1 Input/Output Stream Lesson #10 Note: CIS 601 notes were originally developed by H. Zhu for NJIT DL...
1
Input/Output Stream
Lesson #10
Note: CIS 601 notes were originally developed by H. Zhu for NJIT DL Program. The notes were subsequently revised by M. Deek
2
Streams
A stream is a sequence of bytes. Bytes are moved from memory to
devices, and vice versa. The stream I/O facilities convert typed
objects into sequences of characters, and vice versa.
3
iostream Library Header Files
<iostream.h>basic stream input and output operations
<iomanip.h>formatted I/O with parametrized stream
manipulators <fstream.h>
file processing <strstream.h>//<strstrea.h> in VC++
formatting with character arrays
4
I/O Class Hierarchy
ios
istream ostream
iostream
fstream
5
Output of Built-in Typesclass ostream : public virtual ios {...
public:ostream& operator<<(const char*);ostream& operator<<(char);ostream& operator<<(short);ostream& operator<<(int);ostream& operator<<(long);ostream& operator<<(double);...
6
Output of User-Defined Types
#include <iostream.h>class rational {
int num, den; public:
rational(int n=0, int d=1) { num=n; den = d; }int get_num() { return num; }int get_den() { return den; }
};
7
Output of User-Defined Types
ostream& operator<<(ostream& os, rational r){ os << '(' << r.get_num() <<','
<< r.get_den() <<')';return os;
}void main(){ rational r(3, 10);
cout << "r = " << r << '\n' ;
}//ex10-1.cpp, output: r = (3,10)
Overloading the operator<<!!!
8
The put Member Function
#include <iostream.h>void main(){ int n = 26;
float f = 5.0 / 2.0;cout << n <<"; "<<f<<endl;char c ='X' ;cout.put(c);cout.put(c).put('Y').put('\n') ;
}//ex10-2.cpp
26; 2.5XXY
Result:?
9
The Input Stream cin
#include <iostream.h>void main(){ int a, b; float r; char ch;
cout <<"input two integers, one float and a character: \n";cin >> a >> b >> r >> ch;cout <<"a= " << a << ", b= " << b << '\n' ;cout <<"r= " << r << ", ch= " << ch << '\n' ;
}//ex10-3.cpp
10
11
Input of Built-in Types
class istream : public virtual ios {// ...
public:istream& operator>>(char *);istream& operator>>(char&);istream& operator>>(short&);istream& operator>>(int&);istream& operator>>(long&);istream& operator>>(float&);...
12
The istream::get functions
class istream : public virtual ios {
...
int get();
istream& get(char& c);
istream& get(char* p, int n, char=‘\n’);
...
};
13
returns the next input character reads white space returns EOF when end of stream is
reached
get() with no arguments
14
get() with no arguments
#include <iostream.h> int main() {char name[80]; char ch = '\0'; int i = 0; cout << "Enter your name: "; while(1) { ch = cin.get(); if( ch == '\n') break; cout.put(ch); name[i++] = ch; } name[i] = '\0'; cout <<'\n'<< name<<'\n'; return 0; }//ex10-4.cpp
15
16
get(char&) with one argument
reads the next input character into the character argument
reads white space returns false when end of stream is
reached returns an istream reference
17
Using get(char&) to Copy
#include <iostream.h>void main(){ char ch;
while( cin.get(ch) && (ch != '\n'))cout.put(ch);
}//ex10-5.cpp
It is a test.It is a test.
Result:
18
The 3-argument istream::get()
istream & get (char * buf, int len, char delim = ‘\n’) reads at most (len-1) characters stores input into a vector of characters(buf) stores the null character at the end stops reading when delimiter is encountered delimiter will be the next character to read
19
#include <iostream.h>main(){ char name[30]; while(1) {cout << “Enter a name:”;
cin.get(name, 30, ‘\n’); //cin.get(name, 30);if (cin.get(ch) && ch == ‘\n’) break;else{ cout << “excess input!”<<endl;
cin.ignore(1000, ‘\n’); } cout <<name<<endl;}}//ex10-6.cpp
20
ignoreistream istream::ignore(int n=1, int delim=EOF);
skips the specified number of character the default is 1, or until the delimiter is reached, the default is EOF.
21
getline()#include <iostream.h>void main(){ char name[30], ch;
while(1){ cout << "Enter a name:";
cin.getline(name, 30);if (cin.get(ch) && ch == '\n') break;else{ cout << "excess input!"<<endl;
cin.ignore(100, '\n');}
}cout << name<<endl;
}//ex10-6-2.cpp
Enter a name: John Smith
John Smith
Result:
22
Error Detection
#include <iostream.h> void main() {int i; float r; long n; cin >> i >> r>>n; cout<<"i = "<<i<<'\n' <<"r = "<<r<<'\n' <<"n = "<<n<<'\n' <<"cin.good()= "<<cin.good()<<'\n'; }//ex10-6-3.cpp
23
24
25
The io-state bitsclass ios {
//...public:
enum io_state {goodbit = 0,eofbit = 1,failbit = 2,badbit = 4
}; ...};
26
The rdstate() Member Function
returns the state of a stream as a set of io-state bits:
int s = cin.rdstate();
27
Examining the State if( s & ios::goodbit )
// last operation on cin succeededif( s & ios::badbit )
// characters from cin possibly lost if( s & ios::failbit )
// some formatting error if( s & ios::eofbit )
// reached the end of file
28
Input of User-Defined Typesistream& operator>>(istream& s, rational & r){ /* allow only input of the form: (n) or (n,d)*/
int n=0, d=1;char c;s >> c;if ( c == '(' ) { s >> n >> c;
if (c == ',') s >> d >> c;if ( c == ')') r =rational(n,d);
} else s.putback(c);return s;
}//add this to ex10-1.cpp => ex10-6-4.cpp
29
Input of User-Defined Types
void main()
{ rational r;
cin >> r;
cout << "r = " << r << '\n' ;
} //ex10-6-4.cpp
30
31
Unformatted I/O functions read
istream& istream::read(char* ptr, int n); reads into a character array the number of characters
specified by the second argument n. write
ostream& ostream::write(const char*, int ); outputs from the character array the number of bytes
specified by its second argument. gcount
int istream::gcount(); returns the number of characters read by the last
input operation
32
#include <iostream.h>
void main()
{ char v[20];
int n;
cin.read( v, 10);
n = cin.gcount() ;
cout <<n << endl;
cout.write( v, n);
}//ex10-6-1.cpp
1234567890101234567890
Result:
Example
33
The Class iosclass ios {
...
public:
ostream* tie(ostream* s);//set the stream tied
ostream* tie();//get the stream tied
long flags(long f);//set the new, return the prev.
long flags() const;//return the current flag
34
long setf(long setbits, long field);//set flags in a //particular field and return the old
long setf(long);//set one or more flags, return the old
long unsetf(long);//clear one or more flags, return old
int rdstate() const;//get the state of the stream
int eof() const;//check reaching the end of the stream
int fail() const;
int bad() const;
int good() const;
void clear()(int i=0);
...
};
35
The fill Member function
Allows us to specify the fill character
cout.fill(‘#’);
(remains in effect until changed)
36
Manipulators
allows formatting operations to be inserted directly in the list of input or output operations.
#include <iostream.h>
#include <iostream.h>
void main()
{ int n, m;
cin >>dec >>n;
cin >>hex >>m;
cout<<dec << n << "; "<<m<< endl;
}//ex10-7.cpp
12 1212; 18
Result:
37
Standard Manipulatorsios& oct(ios&);//output in octal
ios& dec(ios&);//output in decimal
ios& hex(ios&);//outpur in hexadecimal
ostream& endl(ostream&); //add a ’\n’ and flush
ostream& ends(ostream&); //add a ’ ’ and flush
ostream& flush(ostream&);// output the buffer
istream& ws(istream&);// ignore the space
38
Example#include <iostream.h>
#include <iomanip.h>
void main()
{ int j = 200;
cout << ".........." << '\n'
<<setw(5)<<1<< '\n'
<<2 << '\n'
<<setw(6)<<3<< '\n'
<< setfill('*')
<< setw(10) << j << '\n'
<< setw(6) << j +1 << endl;
} //ex10-8.cpp
39
User-Defined Manipulators
manipulator to produce a tabostream& tab(ostream& os)
{ return os << ‘\t’ ; } produce an \n and a flush
ostream& ENDL(ostream& s)
{ return s << ‘\n’ << flush ; }
40
Example#include <iostream.h>#include <iomanip.h>ostream& tab(ostream& os) {return os << '\t';};ostream& ENDL(ostream& s){return s << ‘\n’ << flush ; }void main(){ int A = 65, B = 42; char x[20];
cout <<A << ',' <<oct <<A << ',‘ <<hex <<A << ',' <<B << ',‘ <<dec <<B << ','<<endl;
cin >> ws >> x;cout << tab <<"x = "<< tab << x << ENDL;
}//ex10-9.cpp
41
How Does it Work?class ostream : public virtual ios {// ...public:ostream& operator<<(ostream& (*f)(ostream &)){ return (*f)(*this); }
//...};ostream& tab(ostream& os) {return os << '\t';};ostream& ENDL(ostream& s){return s << ‘\n’ << flush ; } cout <<tab <<ENDL; //… cout.operator<<(tab).operator <<(ENDL)//tab(cout) ENDL(cout)
42
Example#include <iostream.h>#include <iomanip.h>void main(){ float x = 123.45;cout.width(8);cout.fill('*');cout.setf(ios::left, ios::adjustfield);cout <<"x = " << x <<endl;cout.setf(ios::scientific, ios::floatfield);cout << 1234.56789<<endl;cout.precision(7);cout << 1234.56789 <<'\n';} //ex10-10.cpp
43
44
Other Manipulators
smanip<int> setfill(int);//set the filling ‘c’
smanip<int> setprecision(int);
//set the spaces to display
smanip<int> setw(int);
//set the spaces to display the following
...
45
ios Manipulator (with argument)
#include <iostream.h>#include <iomanip.h>void main(){ int x = 23;
float f = 12.345;cout <<setw(6)<<setfill('#')<< hex << x << '\n';//no dotcout << oct << x << '\n';cin >> oct >> x;cout << dec<<x<<ends;cout <<setprecision(6) << f << '\n';
//effective digits, round up}//ex10-11.cpp
46
47
Format State
class ios {
public:
enum {
skipws=01, //skip white space on input
left=02, // padding after value
right=04, // padding before value
internal=010, //padding between sign/value
dec=020, // decimal
oct=040, // octal
hex=0100, //hexadecimal
48
showbase=0200, // show integer baseshowpoint=0400, // print trailing zerosuppercase=01000, // ‘E’ ‘X’, not ‘e’ ‘x’showpos=02000, // explicit ‘+’ for integersscientific=04000, // .dddddd Eddfixed=010000, // dddd.ddunitbuf=020000, //flush after each operat.stdio=040000 //flush after each char.
}; // ...};
49
Flags A set of formatting instructions using the
function flags().int options= ios::right | ios::hex | ios::fixed;cout.flags(options);// saving options and setting a new one
int old_opt = cout.flags(new_opt);// changing one option without affecting others
cout.flags(cout.flags() | ios::showpos );// restoring old options
cout.flags(old_opt);
50
setf(long) and unsetf(long)
setf(long) sets the options specified by its argument, without changing any of the other options.
unsetf(long) unsets the options specified by its argument.
51
The setf(long, long) Function
cout.setf(ios::oct, ios::basefield);cout.setf(ios::dec, ios::basefield);cout.setf(ios::hex, ios::basefield);cout.setf(ios::left, ios::adjustfield);cout.setf(ios::right, ios::adjustfield);cout.setf(ios::internal, ios::adjustfield);cout.setf(ios::scientific, ios::floatfield);cout.setf(ios::fixed, ios::floatfield);cout.setf( 0, ios::floatfield); // default
52
The precision() Member Function
specifies the floating point precision the default is 6 remains set until next call to precision
cout.precision(8);
53
Formatting Functions
class ios {//...
public:int width(int w);//set the width return the prev. oneint width() const;//return the current widthint precision(int);//set the new, return the old,int precision() const;//return the currentchar fill(char); //set the new char and returns the prevchar fill() const; //return the current fill character
…};
54
The width Member Function
Allows us to specify the minimum number of characters to be used for the next numeric or string output operations.
cout.width(5); affects only the immediate numeric or
string output. larger values will not be truncated. smaller values will be padded with the fill
characters.
55
Example 1#include <iostream.h> #include <iomanip.h>void main(){ float g = 1.2345678;
cout <<g <<'\n';char oldfill = cout.fill('0');int oldprecis = cout.precision(4);//four effective digitscout.width(8) cout << g << '\n';cout.fill(oldfill);cout.precision(oldprecis);cout.width(8);cout<< g << '\n';
}//ex11-12.cpp
56
57
Example 2#include <iostream.h> #include <iomanip.h>void main(){ double e = 1.234;
float f = 2.1, g = 1212.25;char ch = 'a';cout.setf(ios::fixed|ios::showpoint);cout <<setfill('*')<<setprecision(4)<<setw(10)<<f<<'\n';int options= ios::right | ios::hex | ios::fixed, i = 22;cout.flags(options);cout <<setw(6)<<i<<endl;
}//ex11-13.cpp
58
59
Files and Streamsclass ostream : public virtual ios { //...public:
ostream& flush();ostream& seekp(streampos);ostream& seekp(streamoff, seek_dir);streampos tellp();// ...
};
60
Seek Direction
class ios {//...
public:enum seek_dir {
beg=0,cur=1,end=2
};//...
};
61
Opening an Output File
ofstream of(“data”, ios::out); in ios::out mode the file is truncated by default, ofstream implies that the file is
opened as “out” mode. ofstream of(“data”);
Append Mode ofstream of(“data”, ios::app);
62
File Opening Modes ios::app //Write output to end of file ios::ate //Move to end of file. Allows
//data to be written anywhere ios::in //Open file for input ios::out //Open file for output ios::trunc //erase file contents ios::nocreate //if file does not exist, the
//operation fails ios::noreplace //if the file exists, the
operation //fails
63
The open Member function
An ofstream object can be created without opening a specific file:
ofstream of;
A file can be attached to an ofstream object:
of.open(“data”, ios::out);
64
Testing the Success of open
if ( ! of ) ...
true if failbit or badbit are set.
Possible errors: opening a non-existent file attempting to read without permission attempting to write with no disk space
65
The void* operator
returns 0 if badbit or failbit has been set:
ios::operator void*() const
{
return fail() ? (void *)0 : (void *) (-1) ;
}
66
Closing a File
A file is implicitly closed when the ofstream object is destroyed.
We can explicitly close a file by using:
of.close();
67
Members of istream
class istream : public virtual ios {//...
public:int peek();istream& putback(char c);istream& seekg(streampos);istream& seekg(streamoff, seek_dir);streampos tellg();//...
};
68
Opening an Input File
By default files are open as “in” mode:
ifstream if(“indata”, ios::in);
ifstream if(“indata”);
69
The open Member Function
An ifstream object may be created without specifying a file:
ifstream if;
if.open(“indata”, ios::in);
70
Repositioning a File Pointer
Reposition pointer at the beginning:if.seekg(0)
Reposition to the nth byte:if.seekg(n);
Position y bytes back from endif.seekg(y, ios::end);
Position at end of file:if.seekg(0, ios::end);
71
tellg and tellp
tellg() and tellp() return the current pointer position:
long pos = if. tellg();//Gets the value for the //stream's get pointer.
long pos = if. tellp();//Gets the value for the stream's put pointer
72
Creating an Inventory
#include <iostream.h>#include <fstream.h>#include <stdlib.h>void main(){ char name[10]; int quantity; ofstream outf("inventory", ios::out); if( !outf ) {
cerr << "Cannot open file\n";exit(1);
} cout << "Enter item name and quantity: " << endl; while( cin >> name >> quantity)
outf << name << ' ' << quantity << endl;}//ex10-inventory.cpp ^z to end!!!
73
74
Read/Print Inventory#include <iostream.h>#include <fstream.h>#include <iomanip.h>#include <stdlib.h>void main(){ char name[10]; int quantity; ifstream inf("inventory", ios::in); if( !inf ) { cerr << "Cannot open file\n"; exit(1); } while( inf >> name >> quantity)
cout << setiosflags(ios::left) << setw(10) << name << setiosflags(ios::right) << setw(7) << quantity << endl;
}//ex10-rpinve.cpp
75
76
Query Inventory#include <iostream.h>#include <fstream.h>#include <iomanip.h>#include <stdlib.h>#include <string.h>void main(){ char name[10]; int quantity; char item[10]; ifstream inf("inventory", ios::in); if( !inf ) { cerr << "Cannot open file\n"; exit(1); }
77
Query Inventory cout << "item name:"; cin >> item; inf >> name >> quantity; while( !inf.eof() ) {
if( !strcmp(name, item) ) cout << setiosflags(ios::left) << setw(10) << name
<< setiosflags(ios::right)<< setw(7) << quantity << endl;
inf >> name >> quantity; }}//ex10-queryinv.cpp
78
79
Processing String Streams
Supported by the class istrstream. Allows:
inputting from character arrays in memory outputting to character arrays in memory
must include the following header filesin your program: iostream.h strstream.h//strstrea.h for VC++
80
Types of ostrstream Objects
Dynamic:
Allocates space as need. The member function str() is used to fix its size.
Static:
The object is initialized with a fixed-size array.
81
A Dynamic ostrstream#include <iostream.h>
#include <strstrea.h>
void main()
{ ostrstream s;
char* s1 = "Hello, world";
s << s1 << 123 << '\n';
s << "goodbye\n" << ends;
char* string = s.str();
cout << string;
}//ex10-dyn.cpp
Hello, world123goodbye
Result:
82
A Static ostrstream #include <iostream.h> #include <strstrea.h> void main() { const int size=6; int x=12345; char buf[size]; ostrstream s(buf, size, ios::out); s << "x = " << x << ends; cout << "buf contains: " << buf << endl; }//ex10-static.cpp
83
84
Reading
Readings Chapter 2 Section 2.5, Chapter 3 Sections 3.5 - 3.6