Streams, Files, and Formatting Chapter 8. 2 8.1 Standard Input/Output Streams t Stream is a sequence...

Post on 27-Dec-2015

232 views 3 download

Tags:

Transcript of Streams, Files, and Formatting Chapter 8. 2 8.1 Standard Input/Output Streams t Stream is a sequence...

Streams, Files, and Formatting

Chapter 8

2

8.1 Standard Input/Output Streams

Stream is a sequence of characters Working with cin and cout Streams convert internal representations to

character streams >> input operator (extractor) << output operator (inserter) Streams have no fixed size

3

Reading Data >>

Leading white space skipped <nwln> also skipped Until first character is located

cin >> ch; Also read character plus white space as a

character– get and put functions

4

CountChars.cpp

// File: CountChars.cpp

// Counts the number of characters and lines in

// a file

#include <iostream>

#include <string>

using namespace std;

#define ENDFILE "CTRL-Z"

5

CountChars.cpp

int main()

{

const char NWLN = '\n'; // newline character

char next;

int charCount;

int totalChars;

int lineCount;

lineCount = 0;

totalChars = 0;

6

CountChars.cpp

cout << "Enter a line or press " << ENDFILE <<

": ";

while (cin.get(next))

{

charCount = 0;

while (next != NWLN && !cin.eof())

{

cout.put(next);

charCount++;

totalChars++;

cin.get(next);

} // end inner while

7

CountChars.cpp

cout.put(NWLN);

lineCount++;

cout << "Number of characters in line " <<

lineCount << " is " << charCount << endl;

cout << "Enter a line or press " <<

ENDFILE << ": ";

} // end outer while

cout << endl << endl <<

"Number of lines processed is " <<

lineCount << endl;

8

CountChars.cpp

cout << "Total number of characters is " <<

totalChars << endl;

return 0;

}

9

8.2 External Files

Batch– Requires use of data files (save to disk)– Batch can be run during off peak use– allows things to be complete at start of day

Interactive– Real time systems– Ok for smaller programs– Programs that complete quickly

10

Files

Naming– .cpp .dat .out .in

How to attach files to the stream– stream object– external file name– internal name– open

Additional functions as part of fstream.h class

11

Files

Declare the stream to be processed need to #include fstreamifstreamins; // input stream

ofstream outs; // output stream Need to open the files

ins.open (inFile);

outs.open (outFile);

12

Files

#define associates the name of the stream with the actual file name

fail() function - returns true if file fails to open

Program CopyFile.cpp demonstrates the use of the other fstream functions– get , put, close and eof– discuss program

13

CopyFile.cpp

// File: CopyFile.cpp

// Copies file InData.txt to file OutData.txt

#include <cstdlib>

#include <fstream>

using namespace std;

// Associate stream objects with external file

// names

#define inFile "InData.txt"

#define outFile "OutData.txt"

14

CopyFile.cpp

// Functions used ...

// Copies one line of text

int copyLine(ifstream&, ofstream&);

int main()

{

// Local data ...

int lineCount;

ifstream ins;

ofstream outs;

15

CopyFile.cpp

// Open input and output file, exit on any

// error.

ins.open(inFile);

if (ins.fail ())

{

cerr << "*** ERROR: Cannot open " <<

inFile << " for input." << endl;

return EXIT_FAILURE;// failure return

} // end if

16

CopyFile.cpp

outs.open(outFile);

if (outs.fail())

{

cerr << "*** ERROR: Cannot open " <<

outFile << " for output." << endl;

return EXIT_FAILURE;// failure return

} // end if

// Copy each character from inData to outData.

lineCount = 0;

do

{

17

CopyFile.cpp

if (copyLine(ins, outs) != 0)

lineCount++;

} while (!ins.eof());

// Display a message on the screen.

cout << "Input file copied to output file." <<

endl;

cout << lineCount << " lines copied." << endl;

ins.close();

outs.close();

return 0; // successful return

}

18

CopyFile.cpp

// Copy one line of text from one file to another

// Pre: ins is opened for input and outs for

// output.

// Post: Next line of ins is written to outs.

// The last character processed from

// ins is <nwln>;

// the last character written to outs

// is <nwln>.

// Returns: The number of characters copied.

int copyLine (ifstream& ins, ofstream& outs)

{

19

CopyFile.cpp

// Local data ...

const char NWLN = '\n';

char nextCh;

int charCount = 0;

// Copy all data characters from stream ins to

// stream outs.

ins.get(nextCh);

while ((nextCh != NWLN) && !ins.eof())

{

outs.put(nextCh);

charCount++;

20

CopyFile.cpp

ins.get (nextCh);

} // end while

// If last character read was NWLN write it

// to outs.

if (!ins.eof())

{

outs.put(NWLN);

charCount++;

}

return charCount;

} // end copyLine

21

CopyFile.cpp

Program Output

Input file copied to output file.

37 lines copied.

22

File Processing

Loop processing– for loops– while loops

Newline character– eof() function returns a False if file is not empty

while ( ! ins.eof())

{

do stuff

}

23

8.3 Using External File Functions

Payroll Case Study Two programs process the payroll Design Process

– Problem Analysis– Program Design– Program Implementation– Program Verification and Test

24

Payroll Case Structure Chart

P re pa refi les

P roce ss a lle m p lo yees

D isp layp ay ro ll

W r i te thep ayro ll f i le

processEmp

25

ProcessEmp Structure Chart

R e ad e m p loyeefirs t a n d la st

n a m es

R e ad e m p loyeesa la ry d a ta (h ou rs

a n d ra te )

C o m p u tesa la ry

A ddsa la ry to

to ta l p ay ro ll

W r i te f i r sta n d la st n am es

a nd sa la ry

P roce ss a lle m p lo yees

26

Payroll.cpp

// File: Payroll.cpp

// Creates a company employee payroll file

// computes total company payroll amount

#include <fstream>

#include <cstdlib>

#include "money.h"

#include "money.cpp"

using namespace std;

27

Payroll.cpp

// Associate streams with external file names

#define inFile "EmpFile.txt" // employee file

#define outFile "Salary.txt" // payroll file

// Functions used ...

// PROCESS ALL EMPLOYEES AND COMPUTE TOTAL

money processEmp(istream&, ostream&);

int main()

{

ifstream eds;

ofstream pds;

money totalPayroll;

28

Payroll.cpp

// Prepare files.

eds.open(inFile);

if (eds.fail ())

{

cerr << "*** ERROR: Cannot open " << inFile

<< " for input." << endl;

return EXIT_FAILURE;// failure return

}

pds.open(outFile);

if (pds.fail())

{

29

Payroll.cpp

cerr << "***ERROR: Cannot open " << outFile << " for output." << endl; eds.close(); return EXIT_FAILURE; // failure return }

// Process all employees and compute total // payroll. totalPayroll = processEmp(eds, pds);

// Display result. cout << "Total payroll is " << totalPayroll <<

endl;

30

Payroll.cpp

// Close files.

eds.close();

pds.close();

return 0;

}

31

Payroll.cpp

// Insert processEmp here.

// Process all employees and compute total

// payroll amount

// Pre: eds and pds are prepared for

// input/output.

// Post: Employee names and salaries are

// written from eds to pds

// and the sum of their salaries is returned.

// Returns: Total company payroll

money processEmp (istream& eds, ostream& pds)

{

32

Payroll.cpp

string firstName;

string lastName;

float hours; // input: hoursWorked

money rate; // input: hourly rate

money salary; // output: gross salary

money payroll; // return value - total company payroll

payroll = 0.0;

// Read first employee's data record.

eds >> firstName >> lastName >> hours >> rate;

33

Payroll.cpp

while (!eds.eof())

{

salary = hours * rate;

pds << firstName << lastName << salary <<

endl;

payroll += salary;

// Read next employee's data record.

eds >> firstName >> lastName >> hours >>

rate;

} // end while

return payroll;

} // end processEmp

34

PayrollFile.cpp

Program Output

Total payroll is $677.38

35

8.4 More on Reading String Data

Getline - could be used to process an entire line of data

Use # as a delimiter charactergetline (eds, name, ‘#’);

Advance the newlinegetline (eds, name, ‘\n’);

Use care when choosing cin, get or getline

36

8.5 Input/Output Manipulators

Chapter 5 covered setf, unsetf, precision and width

Can be used with the cout and << Table 8.3 lists various manipulator functions

(setiosflags, setprecision, setw) #include iomanip when using Can be used with external files like stdout

and stdin

37

Formatting with State Flags

Depending on the setiosflags or unsetiosflags– Output can be controlled by other format state

flag– Flags are enumerated types

ios::flagname Table 8.3 lists some flags

– boolalpha, fixed, left, right, showpoint etc

38

8.6 Common Programming Errors

Connecting streams and external files– Declare stream object and open the file

Watch use of while loops when processing– Test values see what you actually have

Reading past the eof White space Newline character Formatting via flags