File Processing

34
611 18200 計計計計計計計 Lecture 17-1 計計計計計計計計計計計 計計計 17 File Processing

description

17. File Processing. 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Updating Sequential Files. OBJECTIVES. In this chapter you will learn: - PowerPoint PPT Presentation

Transcript of File Processing

Page 1: File Processing

611 18200 計算機程式語言 Lecture 17-1 國立台灣大學生物機電系

林達德

1717

File Processing

Page 2: File Processing

611 18200 計算機程式語言 Lecture 17-2 國立台灣大學生物機電系

林達德

17.1 Introduction17.2 The Data Hierarchy17.3 Files and Streams17.4 Creating a Sequential File17.5 Reading Data from a Sequential File17.6 Updating Sequential Files

Page 3: File Processing

611 18200 計算機程式語言 Lecture 17-3 國立台灣大學生物機電系

林達德

OBJECTIVESIn this chapter you will learn: To create, read, write and update files. Sequential file processing.

Page 4: File Processing

611 18200 計算機程式語言 Lecture 17-4 國立台灣大學生物機電系

林達德

17.1 Introduction

• Storage of data– Arrays, variables are temporary

– Files are permanent• Magnetic disk, optical disk, tapes

• In this chapter– Create, update, process files

– Sequential and random access

– Formatted and raw processing

Page 5: File Processing

611 18200 計算機程式語言 Lecture 17-5 國立台灣大學生物機電系

林達德

17.2 The Data Hierarchy

• From smallest to largest– Bit (binary digit)

• 1 or 0

• Everything in computer ultimately represented as bits

• Cumbersome for humans to use

• Character set

– Digits, letters, symbols used to represent data

– Every character represented by 1's and 0's

– Byte: 8 bits• Can store a character (char)

• Also Unicode for large character sets (wchar_t)

Page 6: File Processing

611 18200 計算機程式語言 Lecture 17-6 國立台灣大學生物機電系

林達德

17.2 The Data Hierarchy

• From smallest to largest (continued)– Field: group of characters with some meaning

• Your name

– Record: group of related fields• struct or class in C++

• In payroll system, could be name, SS#, address, wage

• Each field associated with same employee

• Record key: field used to uniquely identify record

– File: group of related records• Payroll for entire company

• Sequential file: records stored by key

– Database: group of related files• Payroll, accounts-receivable, inventory…

Page 7: File Processing

611 18200 計算機程式語言 Lecture 17-7 國立台灣大學生物機電系

林達德

17.2 The Data Hierarchy

Page 8: File Processing

611 18200 計算機程式語言 Lecture 17-8 國立台灣大學生物機電系

林達德

17.3 Files and Streams

• C++ views file as sequence of bytes– Ends with end-of-file marker

• When file opened– Object created, stream associated with it– cin, cout, etc. created when <iostream> included

• Communication between program and file/device

Page 9: File Processing

611 18200 計算機程式語言 Lecture 17-9 國立台灣大學生物機電系

林達德

17.3 Files and Streams

• To perform file processing– Include <iostream> and <fstream>– Class templates

• basic_ifstream (input)• basic_ofstream (output)• basic_fstream (I/O)

– typedefs for specializations that allow char I/O• ifstream (char input)• ofstream (char output)• fstream (char I/O)

Page 10: File Processing

611 18200 計算機程式語言 Lecture 17-10 國立台灣大學生物機電系

林達德

17.3 Files and Streams

• Opening files– Create objects from template

– Derive from stream classes• Can use stream methods from Ch. 15• put, get, peek, etc.

Page 11: File Processing

611 18200 計算機程式語言 Lecture 17-11 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

• C++ imposes no structure on file– Concept of "record" must be implemented by programmer

• To open file, create objects– Creates "line of communication" from object to file

– Classes• ifstream (input only)• ofstream (output only)• fstream (I/O)

– Constructors take file name and file-open modeofstream outClientFile( "filename", fileOpenMode );

– To attach a file laterOfstream outClientFile;outClientFile.open( "filename", fileOpenMode);

Page 12: File Processing

611 18200 計算機程式語言 Lecture 17-12 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

• File-open modes

– ofstream opened for output by default• ofstream outClientFile( "clients.dat", ios::out );• ofstream outClientFile( "clients.dat");

Mode Description

Ios::app Append all output to the end of the file.

ios::ate Open a file for output and move to the end of the file (normally used to append data to a file). Data can be written anywhere in the file.

ios::in Open a file for input.

ios::out Open a file for output.

ios::trunc Discard the file’s contents if they exist (this also is the default action for ios::out).

ios::binary Open a file for binary (i.e., nontext) input or output.

Page 13: File Processing

611 18200 計算機程式語言 Lecture 17-13 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

• Operations– Overloaded operator!

• !outClientFile• Returns nonzero (true) if badbit or failbit set

– Opened non-existent file for reading, wrong permissions

– Overloaded operator void*• Converts stream object to pointer• 0 when when failbit or badbit set, otherwise nonzero

– failbit set when EOF found• while ( cin >> myVariable )

– Implicitly converts cin to pointer

– Loops until EOF

Page 14: File Processing

611 18200 計算機程式語言 Lecture 17-14 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

• Operations– Writing to file (just like cout)

• outClientFile << myVariable

– Closing file• outClientFile.close()• Automatically closed when destructor called

Page 15: File Processing

611 18200 計算機程式語言 Lecture 17-15 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

Use caution when opening an existing file for output (ios::out), especially when you want to preserve the file’s contents, which will be discarded without warning.

Common Programming Error 17.1

Page 16: File Processing

611 18200 計算機程式語言 Lecture 17-16 國立台灣大學生物機電系

林達德

17.4 Creating a Sequential-Access File

Closing files explicitly when the program no longer needs to reference them can reduce resource usage (especially if the program continues execution after closing the files).

Performance Tip 17.1

Page 17: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-17 國立台灣大學生物機電系

林達德

1 // Fig. 17.4: Fig17_04.cpp

2 // Create a sequential file.

3 #include <iostream>

4 using std::cerr;

5 using std::cin;

6 using std::cout;

7 using std::endl;

8 using std::ios;

9

10 #include <fstream> // file stream

11 using std::ofstream; // output file stream

12

13 #include <cstdlib>

14 using std::exit; // exit function prototype

15

16 int main()

17 {

18 // ofstream constructor opens file

19 ofstream outClientFile( "clients.dat", ios::out );

20

21 // exit program if unable to create file

22 if ( !outClientFile ) // overloaded ! operator

23 {

24 cerr << "File could not be opened" << endl;

25 exit( 1 );

26 } // end if

27

28 cout << "Enter the account, name, and balance." << endl

29 << "Enter end-of-file to end input.\n? ";

fig17_04.cpp(1 of 2)

Notice the the header files required for file I/O.

ofstream object created and used to open file "clients.dat". If the file does not exist, it is created.

! operator used to test if the file opened properly.

Page 18: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-18 國立台灣大學生物機電系

林達德

30

31 int account;

32 char name[ 30 ];

33 double balance;

34

35 // read account, name and balance from cin, then place in file

36 while ( cin >> account >> name >> balance )

37 {

38 outClientFile << account << ' ' << name << ' ' << balance << endl;

39 cout << "? ";

40 } // end while

41

42 return 0; // ofstream destructor closes file

43 } // end main Enter the account, name, and balance. Enter end-of-file to end input.

? 100 Jones 24.98

? 200 Doe 345.67

? 300 White 0.00

? 400 Stone -42.16

? 500 Rich 224.62

? Z

fig17_04.cpp(2 of 2)

Page 19: File Processing

611 18200 計算機程式語言 Lecture 17-19 國立台灣大學生物機電系

林達德

14.5 Reading Data from a Sequential-Access File

• Reading files– ifstream inClientFile( "filename", ios::in );

– Overloaded !• !inClientFile tests if file was opened properly

– operator void* converts to pointer• while (inClientFile >> myVariable)• Stops when EOF found (gets value 0)

Page 20: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-20 國立台灣大學生物機電系

林達德

fig17_07.cpp(1 of 3)

1 // Fig. 17.7: Fig17_07.cpp

2 // Reading and printing a sequential file.

3 #include <iostream>

4 using std::cerr;

5 using std::cout;

6 using std::endl;

7 using std::fixed;

8 using std::ios;

9 using std::left;

10 using std::right;

11 using std::showpoint;

12

13 #include <fstream> // file stream

14 using std::ifstream; // input file stream

15

16 #include <iomanip>

17 using std::setw;

18 using std::setprecision;

19

20 #include <string>

21 using std::string;

22

23 #include <cstdlib>

24 using std::exit; // exit function prototype

25

26 void outputLine( int, const string, double ); // prototype

Page 21: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-21 國立台灣大學生物機電系

林達德

27

28 int main()

29 {

30 // ifstream constructor opens the file

31 ifstream inClientFile( "clients.dat", ios::in );

32

33 // exit program if ifstream could not open file

34 if ( !inClientFile )

35 {

36 cerr << "File could not be opened" << endl;

37 exit( 1 );

38 } // end if

39

40 int account;

41 char name[ 30 ];

42 double balance;

43

44 cout << left << setw( 10 ) << "Account" << setw( 13 )

45 << "Name" << "Balance" << endl << fixed << showpoint;

46

47 // display each record in file

48 while ( inClientFile >> account >> name >> balance )

49 outputLine( account, name, balance );

50

51 return 0; // ifstream destructor closes the file

52 } // end main

fig17_07.cpp(2 of 3)

Open and test file for input.

Read from file until EOF found.

Page 22: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-22 國立台灣大學生物機電系

林達德

fig17_07.cpp(3 of 3)

53

54 // display single record from file

55 void outputLine( int account, const string name, double balance )

56 {

57 cout << left << setw( 10 ) << account << setw( 13 ) << name

58 << setw( 7 ) << setprecision( 2 ) << right << balance << endl;

59 } // end function outputLine Account Name Balance 100 Jones 24.98 200 Doe 345.67 300 White 0.00 400 Stone -42.16 500 Rich 224.62

Page 23: File Processing

611 18200 計算機程式語言 Lecture 17-23 國立台灣大學生物機電系

林達德

14.5 Reading Data from a Sequential-Access File

• File position pointers– Number of next byte to read/write

– Functions to reposition pointer• seekg (seek get for istream class)• seekp (seek put for ostream class)

• Classes have "get" and "put" pointers

– seekg and seekp take offset and direction• Offset: number of bytes relative to direction

• Direction (ios::beg default)– ios::beg - relative to beginning of stream– ios::cur - relative to current position– ios::end - relative to end

Page 24: File Processing

611 18200 計算機程式語言 Lecture 17-24 國立台灣大學生物機電系

林達德

14.5 Reading Data from a Sequential-Access File

• Examples– fileObject.seekg(0)

• Goes to front of file (location 0) because ios::beg is default

– fileObject.seekg(n)• Goes to nth byte from beginning

– fileObject.seekg(n, ios::cur)• Goes n bytes forward

– fileObject.seekg(y, ios::end)• Goes y bytes back from end

– fileObject.seekg(0, ios::cur)• Goes to last byte

– seekp similar

Page 25: File Processing

611 18200 計算機程式語言 Lecture 17-25 國立台灣大學生物機電系

林達德

14.5 Reading Data from a Sequential-Access File

• To find pointer location– tellg and tellp– location = fileObject.tellg()

• Upcoming example– Credit manager program

– List accounts with zero balance, credit, and debit

Page 26: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-26 國立台灣大學生物機電系

林達德

fig17_08.cpp(1 of 6)

1 // Fig. 17.8: Fig17_08.cpp

2 // Credit inquiry program.

3 #include <iostream>

4 using std::cerr;

5 using std::cin;

6 using std::cout;

7 using std::endl;

8 using std::fixed;

9 using std::ios;

10 using std::left;

11 using std::right;

12 using std::showpoint;

13

14 #include <fstream>

15 using std::ifstream;

16

17 #include <iomanip>

18 using std::setw;

19 using std::setprecision;

20

21 #include <string>

22 using std::string;

23

24 #include <cstdlib>

25 using std::exit; // exit function prototype

26

27 enum RequestType { ZERO_BALANCE = 1, CREDIT_BALANCE, DEBIT_BALANCE, END };

28 int getRequest();

29 bool shouldDisplay( int, double );

30 void outputLine( int, const string, double );

Page 27: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-27 國立台灣大學生物機電系

林達德

fig17_08.cpp(2 of 6)

31

32 int main()

33 {

34 // ifstream constructor opens the file

35 ifstream inClientFile( "clients.dat", ios::in );

36

37 // exit program if ifstream could not open file

38 if ( !inClientFile )

39 {

40 cerr << "File could not be opened" << endl;

41 exit( 1 );

42 } // end if

43

44 int request;

45 int account;

46 char name[ 30 ];

47 double balance;

48

49 // get user's request (e.g., zero, credit or debit balance)

50 request = getRequest();

51

Page 28: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-28 國立台灣大學生物機電系

林達德

fig17_08.cpp(3 of 6)

52 // process user's request

53 while ( request != END )

54 {

55 switch ( request )

56 {

57 case ZERO_BALANCE:

58 cout << "\nAccounts with zero balances:\n";

59 break;

60 case CREDIT_BALANCE:

61 cout << "\nAccounts with credit balances:\n";

62 break;

63 case DEBIT_BALANCE:

64 cout << "\nAccounts with debit balances:\n";

65 break;

66 } // end switch

67

68 // read account, name and balance from file

69 inClientFile >> account >> name >> balance;

70

71 // display file contents (until eof)

72 while ( !inClientFile.eof() )

73 {

74 // display record

75 if ( shouldDisplay( request, balance ) )

76 outputLine( account, name, balance );

77

78 // read account, name and balance from file

79 inClientFile >> account >> name >> balance;

80 } // end inner while

81

Page 29: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-29 國立台灣大學生物機電系

林達德

82 inClientFile.clear(); // reset eof for next input

83 inClientFile.seekg( 0 ); // reposition to beginning of file

84 request = getRequest(); // get additional request from user

85 } // end outer while

86

87 cout << "End of run." << endl;

88 return 0; // ifstream destructor closes the file

89 } // end main

90

91 // obtain request from user

92 int getRequest()

93 {

94 int request; // request from user

95

96 // display request options

97 cout << "\nEnter request" << endl

98 << " 1 - List accounts with zero balances" << endl

99 << " 2 - List accounts with credit balances" << endl

100 << " 3 - List accounts with debit balances" << endl

101 << " 4 - End of run" << fixed << showpoint;

102

103 do // input user request

104 {

105 cout << "\n? ";

106 cin >> request;

107 } while ( request < ZERO_BALANCE && request > END );

108

109 return request;

110 } // end function getRequest

111

fig17_08.cpp(4 of 6)

Use clear to reset eof. Use seekg to set file position pointer to beginning of file.

Page 30: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-30 國立台灣大學生物機電系

林達德

fig17_08.cpp(5 of 6)

112 // determine whether to display given record

113 bool shouldDisplay( int type, double balance )

114 {

115 // determine whether to display zero balances

116 if ( type == ZERO_BALANCE && balance == 0 )

117 return true;

118

119 // determine whether to display credit balances

120 if ( type == CREDIT_BALANCE && balance < 0 )

121 return true;

122

123 // determine whether to display debit balances

124 if ( type == DEBIT_BALANCE && balance > 0 )

125 return true;

126

127 return false;

128 } // end function shouldDisplay

129

130 // display single record from file

131 void outputLine( int account, const string name, double balance )

132 {

133 cout << left << setw( 10 ) << account << setw( 13 ) << name

134 << setw( 7 ) << setprecision( 2 ) << right << balance << endl;

135 } // end function outputLine

Page 31: File Processing

Outline

611 18200 計算機程式語言 Lecture 17-31 國立台灣大學生物機電系

林達德

fig17_08.cpp(6 of 6)

Enter request 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances 4 - End of run

? 1

Accounts with zero balances: 300 White 0.00

Enter request 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances 4 - End of run

? 2

Accounts with credit balances: 400 Stone -42.16

Enter request 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances 4 - End of run

? 3

Accounts with debit balances: 100 Jones 24.98 200 Doe 345.67 500 Rich 224.62

Enter request 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances 4 - End of run

? 4 End of run.

Page 32: File Processing

611 18200 計算機程式語言 Lecture 17-32 國立台灣大學生物機電系

林達德

17.6 Updating Sequential-Access Files

• Updating sequential files– Risk overwriting other data

– Example: change name "White" to "Worthington"• Old data300 White 0.00 400 Jones 32.87

• Insert new data

– Formatted text different from internal representation

– Problem can be avoided, but awkward

300 White 0.00 400 Jones 32.87

300 Worthington 0.00ones 32.87

300 Worthington 0.00

Data gets overwritten

Page 33: File Processing

611 18200 計算機程式語言 Lecture 17-33 國立台灣大學生物機電系

林達德

17.7 Random-Access Files

• Instant access– Want to locate record quickly

• Airline reservations, ATMs

– Sequential files must search through each one

• Random-access files are solution– Instant access

– Insert record without destroying other data

– Update/delete items without changing other data

Page 34: File Processing

611 18200 計算機程式語言 Lecture 17-34 國立台灣大學生物機電系

林達德

17.7 Random-Access Files

• C++ imposes no structure on files– Programmer must create random-access files

– Simplest way: fixed-length records• Calculate position in file from record size and key