File I/O 1 File Names and Types A file name should reflect its contents Payroll.dat Students.txt Grades.txt A file s extension indicates the kind of data the file holds.dat,.txt general program input or output.cpp C++ source file.doc Microsoft word document 2 I/O Streams A stream in C++ is a conduit (pipe) through which data passes Input passes through the istream object and output passes through the ostream object. Input and output are managed by the istream object cin and the ostream object cout The istream class defines the use of the extraction operator >> (used with cin) 3 Stream Extraction and Insertion #include <iostream> Input (stream extraction): cin >> // takes data from stream and sticks in variable Output (stream insertion): cout << // takes data from variable and puts into stream Input (Extraction) skips whitespace! \n, \t,, \r, \v 4 1
Input and Output File Streams Input from a file is managed by an ifstream object in the same way that the input from the keyboard is managed by the istream object cin Similarly, output to a file is managed by an ofstream object in the same way that the output to the monitor is managed by the ostream object cout The difference is that ifstream and ofstream objects have to be declared explicitly and initialized with the external name of the file which they manage #include the <fstream.h> header file Files: Let s Use Them #include <fstream> Declare a file stream variable ifstream infile; //input file stream ofstream outfile; //output file stream Open the files infile.open( MyInput.dat ); outfile.open( MyOutput.dat ); 5 6 Output File Stream Example #include<fstream> #include<iostream> void main() Create a new file stream newfile ofstream newfile; Connect newfile to the file on disk newfile.open("students.txt"); newfile<< this is written to the file ; cout<< this is written to the monitor ; 7 Write a database file, Lab 3 prob 1) char done = 'y'; int acntnum; //an account number float balance; // an account balance ofstream outfile; // a file variable. a) Setting up Output File outfile.open ("accnts.dat"); // prepare database file for writing 8 2
Lab 3 prob 1) continued // Now input values from keyboard and write to the disk. while (done!= 'n') b) Using output file cout << "enter an accnt number and balance: "; cin >> acntnum >> balance; Lab 3 Prob 2) Now Read database file Same file we wrote to float sum = 0.0; ifstream infile; // a file var. for the input infile.open ("accnts.dat"); //prepare file for reading outfile << acntnum << " " << balance << endl; cout << "another account? enter `y' or `n':"; cin >> done; 9 for (n=0; n<3; n++) // sum 3 accounts... infile >> acntnum >> balance; sum += balance; cout << "The total of all accounts is: " << sum ; 10 Always Close your Files Don t forget to close the files when you are done with them infile.close( ); outfile.close( ); Handles any final writing and lets file be reopened later in program. Put this after all reads/writes are finished (usually right before program or function terminates) 11 Alternative Opening Syntax Instead of Declaring then opening: ifstream infile; infile.open( accts.dat ); You can Declare and Open in one statement ifstream infile( accts.dat ); ofstream outfile( accts.dat ); 12 3
Other Capabilities of File Streams A File stream object maintains a true/false value that can be tested to check an operation ifstream infile; infile.open( accts.dat ); If open was unsuccessful if (!infile) cout<< file not found ; exit(1); This message is displayed Loop until end-of-file Process indefinite list in a file: infile>>acntnum>>balance; while(infile) Check stream status after each read // process last data // get next data infile>>acntnum>>balance; And program quits 13 14 A more compact version Process indefinite list in a file: while(infile>>acntnum>>balance) // process data Read data and Check status after each read 15 Tools for Stream Formatting Running Lab 3 Prob 1, if we enter 222 444.777777777 33 12000000.22 We get an accnts.dat file that looks like this: 222 444.778 33 1.2e+07 16 4
Formatting Output to Files Remember to #include <iomanip> Use setprecision(2) -- to force 2 digits of precision for all float data Use fixed to force fixed point formatting (no e-notation allowed) for all following data Use left (-- or right) to justify (line up) on left or right side of column strings look better with left, numbers with right Use setw(10) to output data right justified in a field of 10 spaces Only applies to next data 17 #include <iomanip> Lab 3 Prob1) With Formatting while (done!= 'n') cout << "enter an account number and balance: "; cin >> acntnum >> balance; outfile<<setprecision(2)<<fixed<< setw(10) << acntnum <<setw(15) << balance << endl; cout << "another account? enter `y' or `n':"; cin >> done; 18 The Result! NOW running Listing 8.1 MODIFIED, if we enter 222 444.777777777 33 12000000.22 We get an accnts.dat file that looks like this: 222 444.78 33 12000000.00 19 Creating Space in Output The setw function specifies the number of spaces for the next item Applies only to the next item of output Example: To print the digit 7 in four spaces use outfile<<setw(4)<< 7 << endl; Three of the spaces will be blank 7 (ios::left) Slide 20 5