1 Input/Output Stream Lesson #10 Note: CIS 601 notes were originally developed by H. Zhu for NJIT DL...

84
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.
  • 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...

Page 1: 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.

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

Page 2: 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.

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.

Page 3: 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.

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

Page 4: 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.

4

I/O Class Hierarchy

ios

istream ostream

iostream

fstream

Page 5: 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.

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);...

Page 6: 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.

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; }

};

Page 7: 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.

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<<!!!

Page 8: 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.

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:?

Page 9: 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.

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

Page 10: 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.

10

Page 11: 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.

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&);...

Page 12: 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.

12

The istream::get functions

class istream : public virtual ios {

...

int get();

istream& get(char& c);

istream& get(char* p, int n, char=‘\n’);

...

};

Page 13: 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.

13

returns the next input character reads white space returns EOF when end of stream is

reached

get() with no arguments

Page 14: 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.

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

Page 15: 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.

15

Page 16: 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.

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

Page 17: 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.

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:

Page 18: 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.

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

Page 19: 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.

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

Page 20: 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.

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.

Page 21: 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.

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:

Page 22: 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.

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

Page 23: 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.

23

Page 24: 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.

24

Page 25: 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.

25

The io-state bitsclass ios {

//...public:

enum io_state {goodbit = 0,eofbit = 1,failbit = 2,badbit = 4

}; ...};

Page 26: 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.

26

The rdstate() Member Function

returns the state of a stream as a set of io-state bits:

int s = cin.rdstate();

Page 27: 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.

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

Page 28: 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.

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

Page 29: 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.

29

Input of User-Defined Types

void main()

{ rational r;

cin >> r;

cout << "r = " << r << '\n' ;

} //ex10-6-4.cpp

Page 30: 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.

30

Page 31: 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.

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

Page 32: 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.

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

Page 33: 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.

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

Page 34: 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.

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);

...

};

Page 35: 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.

35

The fill Member function

Allows us to specify the fill character

cout.fill(‘#’);

(remains in effect until changed)

Page 36: 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.

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:

Page 37: 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.

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

Page 38: 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.

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

Page 39: 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.

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 ; }

Page 40: 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.

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

Page 41: 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.

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)

Page 42: 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.

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

Page 43: 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.

43

Page 44: 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.

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

...

Page 45: 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.

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

Page 46: 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.

46

Page 47: 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.

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

Page 48: 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.

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.

}; // ...};

Page 49: 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.

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);

Page 50: 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.

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.

Page 51: 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.

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

Page 52: 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.

52

The precision() Member Function

specifies the floating point precision the default is 6 remains set until next call to precision

cout.precision(8);

Page 53: 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.

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

…};

Page 54: 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.

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.

Page 55: 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.

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

Page 56: 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.

56

Page 57: 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.

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

Page 58: 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.

58

Page 59: 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.

59

Files and Streamsclass ostream : public virtual ios { //...public:

ostream& flush();ostream& seekp(streampos);ostream& seekp(streamoff, seek_dir);streampos tellp();// ...

};

Page 60: 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.

60

Seek Direction

class ios {//...

public:enum seek_dir {

beg=0,cur=1,end=2

};//...

};

Page 61: 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.

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);

Page 62: 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.

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

Page 63: 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.

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);

Page 64: 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.

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

Page 65: 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.

65

The void* operator

returns 0 if badbit or failbit has been set:

ios::operator void*() const

{

return fail() ? (void *)0 : (void *) (-1) ;

}

Page 66: 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.

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();

Page 67: 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.

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();//...

};

Page 68: 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.

68

Opening an Input File

By default files are open as “in” mode:

ifstream if(“indata”, ios::in);

ifstream if(“indata”);

Page 69: 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.

69

The open Member Function

An ifstream object may be created without specifying a file:

ifstream if;

if.open(“indata”, ios::in);

Page 70: 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.

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);

Page 71: 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.

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

Page 72: 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.

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!!!

Page 73: 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.

73

Page 74: 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.

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

Page 75: 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.

75

Page 76: 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.

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); }

Page 77: 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.

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

Page 78: 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.

78

Page 79: 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.

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++

Page 80: 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.

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.

Page 81: 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.

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:

Page 82: 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.

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

Page 83: 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.

83

Page 84: 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.

84

Reading

Readings Chapter 2 Section 2.5, Chapter 3 Sections 3.5 - 3.6