File Processing
File Processing
Principles (CPP)
File Processing
26th June, 2023
2
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)
3
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…
4
Data Hierarchy
Sally Black
Tom Blue
Judy Green File
Iris Orange
Randy Red
1 Bit
5
Files and Streams
• C++ views file as sequence of bytes
—Ends with end-of-file marker
0 1 2 3 4 5 6 7 8 9 ... n-1
... end-of-file marker
6
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)
7
Files and Streams
8
Creating a Sequential-Access
File
• C++ imposes no structure on file
—record concept 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 mode
ofstream outClientFile( "filename", fileOpenMode );
10
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
11
Creating a Sequential-Access
File
• Create a file, open a file and perform writing
operations
• Operations
—Writing to file (just like cout)
• outClientFile << myVariable
—Closing file
• outClientFile.close()
• Automatically closed when destructor called
12
1 // Fig. 14.4: fig14_04.cpp
2 // Create a sequential file.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios;
8 using std::cerr;
9 using std::endl;
10
11 #include <fstream>
12 Notice the the header files
13 using std::ofstream; required for file I/O.
14
15 #include <cstdlib> // exit prototype ofstream object created
16 and used to open file
17 int main() "clients.dat". If the file
18 { does not exist, it is created.
19 // ofstream constructor opens file
20 ofstream outClientFile( "clients.txt", ios::out );
21 ! operator used to test if the
22 // exit program if unable to create file file opened properly.
23 if ( !outClientFile ) { // overloaded ! operator
24 cerr << "File could not be opened" << endl;
25 exit( 1 );
26 13
27 } // end if
28
29 cout << "Enter the account, name, and balance." << endl
30 << "Enter end-of-file to end input.\n? ";
cin is implicitly converted to
31
a pointer. When EOF is
32 int account;
33 char name[ 30 ];
encountered, it returns 0 and
34 double balance; the loop stops.
35
36 // read account, name and balance from cin, then place in file
37 while ( cin >> account >> name >> balance ) {
38 outClientFile << account << ' ' << name << ' ' << balance
39 << endl;
40 cout << "? ";
41 Write data to file like a
42 } // end while
regular stream.
43
44 return 0; // ofstream destructor closes file
45
46 } // end main File closed when destructor
called for object. Can be
explicitly closed with
close().
14
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
15
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)
16
1 // Fig. 14.7: fig14_07.cpp
2 // Reading and printing a sequential file.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios;
8 using std::cerr;
9 using std::endl;
10 using std::left;
11 using std::right;
12 using std::fixed;
13 using std::showpoint;
14
15 #include <fstream>
16
17 using std::ifstream;
18
19 #include <iomanip>
20
21 using std::setw;
22 using std::setprecision;
23
24 #include <cstdlib> // exit prototype
25
26 void outputLine( int, const char * const, double );
17
27
28 int main()
29 {
30 // ifstream constructor opens the file Open and test file for input.
31 ifstream inClientFile( "clients.txt", ios::in );
32
33 // exit program if ifstream could not open file
34 if ( !inClientFile ) {
35 cerr << "File could not be opened" << endl;
36 exit( 1 );
37
38 } // end if
39
40 int account;
41 char name[ 30 ];
42 double balance;
43
44 cout << left << setw( 10 ) << "Account" << setw( 13 )
45 Read
<< "Name" << "Balance" << endl << from<<file
fixed until EOF
showpoint;
46 found.
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
53 } // end main 18
54
55 // display single record from file
56 void outputLine( int account, const char * const name,
57 double balance )
58 {
59 cout << left << setw( 10 ) << account << setw( 13 ) << name
60 << setw( 7 ) << setprecision( 2 ) << right << balance
61 << endl;
62
63 } // end function outputLine
19
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
20
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 21
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
22
Reading Data from a
Sequential-Access File
1 // Fig. 14.8: fig14_08.cpp
2 // Credit-inquiry program.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios;
8 using std::cerr;
9 using std::endl;
10 using std::fixed;
11 using std::showpoint;
12 using std::left;
13 using std::right;
14
15 #include <fstream>
16
17 using std::ifstream;
18
19 #include <iomanip>
20
21 using std::setw;
22 using std::setprecision;
23
24 #include <cstdlib> 23
25
Reading Data from a
Sequential-Access File
26 enum RequestType { ZERO_BALANCE = 1, CREDIT_BALANCE,
27 DEBIT_BALANCE, END };
28 int getRequest();
29 bool shouldDisplay( int, double );
30 void outputLine( int, const char * const, double );
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 cerr << "File could not be opened" << endl;
40 exit( 1 );
41
42 } // end if
43
44 int request;
45 int account;
46 char name[ 30 ];
47 double balance;
48
24
49 // get user's request (e.g., zero, credit or debit balance)
Reading Data from a
Sequential-Access File
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
61 case CREDIT_BALANCE:
62 cout << "\nAccounts with credit balances:\n";
63 break;
64
65 case DEBIT_BALANCE:
66 cout << "\nAccounts with debit balances:\n";
67 break;
68
69 } // end switch
70
25
Reading Data from a
Sequential-Access File
71 // read account, name and balance from file
72 inClientFile >> account >> name >> balance;
73
74 // display file contents (until eof)
75 while ( !inClientFile.eof() ) {
76
77 // display record
78 if ( shouldDisplay( request, balance ) )
79 outputLine( account, name, balance );
80
81 // read account, name and balance from file
82 inClientFile >> account >> name >> balance;
Use clear to reset eof. Use
83
seekg to set file position
84 } // end inner while
85 pointer to beginning of file.
86 inClientFile.clear(); // reset eof for next input
87 inClientFile.seekg( 0 ); // move to beginning of file
88 request = getRequest(); // get additional request from user
89
90 } // end outer while
91
92 cout << "End of run." << endl;
93
94 return 0; // ifstream destructor closes the file
26
95
71 // read account, name and balance from file
72 inClientFile >> account >> name >> balance;
73
74 // display file contents (until eof)
75 while ( !inClientFile.eof() ) {
76
77 // display record
78 if ( shouldDisplay( request, balance ) )
79 outputLine( account, name, balance );
80
81 // read account, name and balance from file
82 inClientFile >> account >> name >> balance;
Use clear to reset eof. Use
83
seekg to set file position
84 } // end inner while
85 pointer to beginning of file.
86 inClientFile.clear(); // reset eof for next input
87 inClientFile.seekg( 0 ); // move to beginning of file
88 request = getRequest(); // get additional request from user
89
90 } // end outer while
91
92 cout << "End of run." << endl;
93
94 return 0; // ifstream destructor closes the file 27
71 // read account, name and balance from file
72 inClientFile >> account >> name >> balance;
73
74 // display file contents (until eof)
75 while ( !inClientFile.eof() ) {
76
77 // display record
78 if ( shouldDisplay( request, balance ) )
79 outputLine( account, name, balance );
80
81 // read account, name and balance from file
82 inClientFile >> account >> name >> balance;
Use clear to reset eof. Use
83
seekg to set file position
84 } // end inner while
85 pointer to beginning of file.
86 inClientFile.clear(); // reset eof for next input
87 inClientFile.seekg( 0 ); // move to beginning of file
88 request = getRequest(); // get additional request from user
89
90 } // end outer while
91
92 cout << "End of run." << endl;
93
94 return 0; // ifstream destructor closes the file
95
96 } // end main
28
121 // determine whether to display given record
122 bool shouldDisplay( int type, double balance )
123 {
124 // determine whether to display credit balances
125 if ( type == CREDIT_BALANCE && balance < 0 )
126 return true;
127
128 // determine whether to display debit balances
129 if ( type == DEBIT_BALANCE && balance > 0 )
130 return true;
131
132 // determine whether to display zero balances
133 if ( type == ZERO_BALANCE && balance == 0 )
134 return true;
135
136 return false;
137
138 } // end function shouldDisplay
139
140 // display single record from file
141 void outputLine( int account, const char * const name,
142 double balance )
143 {
144 cout << left << setw( 10 ) << account << setw( 13 ) << name
145 << setw( 7 ) << setprecision( 2 ) << right << balance
146 << endl;
147 29
148 } // end function outputLine
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
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
30
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
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.
31