File stream

8
I/O File Streams and
Data Files
611 18200 計算機程式語言 Lecture 8-1
國立臺灣大學生物機電系
Contents
•
•
•
•
•
•
•
I/O file stream and methods
Reading and writing character-based files
Random file access
File streams as function arguments
A case study involving pollen count file updates
The iostream class library
Common programming errors
611 18200 計算機程式語言 Lecture 8-2
國立臺灣大學生物機電系
I/O File Stream Objects and Methods
• To store and retrieve data outside a C++
program, two things are needed:
– A file
– A file stream object
• A file is a collection of data stored together under
a common name, usually on disk, magnetic tape,
USB drive, or CD
• Each file has a unique file name, referred to as
file’s external name
611 18200 計算機程式語言 Lecture 8-3
國立臺灣大學生物機電系
I/O File Stream Objects and Methods
• Choose filenames that indicate the type of data
in the file
• Two basic types of files exist
– Text files (also known as character-based files)
– Binary files
611 18200 計算機程式語言 Lecture 8-4
國立臺灣大學生物機電系
I/O File Stream Objects and Methods
• External name: Unique file name for file
– External name is how operating system knows
file
– Contents of directory or folder are listed by
external names
• Format of external names: Each computer
operating system has its own specifications for
external file size
– Table 15.1 lists specifications for more commonly
used operating systems
611 18200 計算機程式語言 Lecture 8-5
國立臺灣大學生物機電系
I/O File Stream Objects and Methods
Table 8.1 Maximum Allowable File Name Characters
611 18200 計算機程式語言 Lecture 8-6
國立臺灣大學生物機電系
I/O File Stream Objects and Methods
• File naming conventions:
– Use descriptive names
– Avoid long file names
• They take more time to type and can result in typing
errors
• Manageable length for file name is 12 to 14
characters, with maximum of 25 characters
– Choose file names that indicate type of data in file
and application for which it is used
• Frequently, first eight characters describe data, and
an extension describes application
611 18200 計算機程式語言 Lecture 8-7
國立臺灣大學生物機電系
File Stream Objects
• File stream: One-way transmission path that is
used to connect file stored on physical device,
such as disk or CD, to program
• Mode (of file stream): Determines whether path
will move data from file into program or from
program to file
• Input file stream: Receives or reads data from
file into program
• Output file stream: Sends or writes data to file
611 18200 計算機程式語言 Lecture 8-8
國立臺灣大學生物機電系
File Stream Objects
• Direction (mode) of file stream is defined in
relation to program and not file:
– Data that goes into program are considered input
data
– Data sent out from program are considered
output data
• Figure 8.1 illustrates data flow from and to file
using input and output streams
611 18200 計算機程式語言 Lecture 8-9
國立臺灣大學生物機電系
File Stream Objects
• For each file your program uses, regardless of
file’s type, a distinct file stream object must be
created
Figure 8.1 Input and output file streams
611 18200 計算機程式語言 Lecture 8-10
國立臺灣大學生物機電系
File Stream Objects
• Distinct file stream object must be created for
each file used, regardless of file’s type
• For program to both read and write to file, both
an input and output file stream object are
required
– Input file stream objects are declared to be of
type ifstream
– Output file streams are declared to be of type
ofstream
611 18200 計算機程式語言 Lecture 8-11
國立臺灣大學生物機電系
File Stream Objects
• Two basic types of files: both store data using
binary code
– Text (character-based) files: Store each
character using individual character code
(typically ASCII or Unicode)
• Advantage: Allows files to be displayed by word
processing program or text editor
– Binary-based files: Store numbers in binary form
and strings in ASCII or Unicode form
• Advantage: Provides compactness
611 18200 計算機程式語言 Lecture 8-12
國立臺灣大學生物機電系
File Stream Methods
• Each file stream object has access to methods
defined for its respective ifstream or
ofstream class, including:
– Opening file: connecting stream object name to
external file name
– Determining whether a successful connection has
been made
– Closing file: closing connection
– Getting next data item into program from input stream
– Putting new data item from program onto output
stream
– Detecting when end of file has been reached
611 18200 計算機程式語言 Lecture 8-13
國立臺灣大學生物機電系
File Stream Methods
• open() method:
– Establishes physical connecting link between
program and file
• Operating system function that is transparent to
programmer
– Connects file’s external computer name to stream
object name used internally by program
• Before a file can be opened, it must be declared
as either ifstream or ofstream object
• File opened for input is said to be in read mode
611 18200 計算機程式語言 Lecture 8-14
國立臺灣大學生物機電系
File Stream Methods
• Example:
inFile.open("prices.dat");
– connects external text file named prices.dat to
internal program file stream object named
inFile
– Accesses file using internal object name inFile
– Computer saves file under the external name
prices.dat
• Calling the open() method uses the standard
object notation:
objectName.open()
611 18200 計算機程式語言 Lecture 8-15
國立臺灣大學生物機電系
File Stream Methods
• fail() method: returns true value if file is
unsuccessfully opened, false if open succeeded
– Good programming practice is to check that
connection is established before using file
• In addition to fail() method, C++ provides three
other methods, listed in Table 8.2, that can be
used to detect file’s status
• Program 8.1 illustrates statements required to
open file for input including error checking routine
to ensure that successful open was obtained
611 18200 計算機程式語言 Lecture 8-16
國立臺灣大學生物機電系
File Stream Methods
• Example of use of fail() method:
ifstream inFile; // any object name can be used here
inFile.open("prices.dat"); // open the file
// check that the connection was successfully opened
if (inFile.fail())
{
cout << "\nThe file was not successfully opened"
<< "\n Please check that the file currently exists."
<< endl;
exit(1);
}
611 18200 計算機程式語言 Lecture 8-17
國立臺灣大學生物機電系
File Stream Methods
Table 8.2 File Status Methods
611 18200 計算機程式語言 Lecture 8-18
國立臺灣大學生物機電系
 Program 8.1
File Stream Methods
#include <iostream>
#include <fstream>
#include <cstdlib>
// needed for exit()
using namespace std;
int main()
{
ifstream inFile;
inFile.open("prices.dat"); // open the file with the
// external name prices.dat
if (inFile.fail()) // check for a successful open
{
cout << "\nThe file was not successfully opened"
<< "\n Please check that the file currently exists."
<< endl;
exit(1);
}
cout << "\nThe file has been successfully opened for reading"
<< endl;
// statements to read data from the file would be placed here
return 0;
}
611 18200 計算機程式語言 Lecture 8-19
國立臺灣大學生物機電系
File Stream Methods
• Different checking required for output files
– If file exists having same name as file to be
opened in output mode, existing file is erased and
all data lost
• To avoid this situation, file is first opened in input
mode to see if it exists
– If it does, user is given choice of explicitly
permitting it to be overwritten (when it is later
opened in output mode)
• Code used to accomplish this is highlighted in
Program 8.2
611 18200 計算機程式語言 Lecture 8-20
國立臺灣大學生物機電系
Embedded and Interactive Filenames
• Programs 8.1 and 8.2 have two problems
– External file name is embedded in program code
– There’s no provision for user to enter file name while
program is running
• As both programs are written, if filename is to
change, programmer must modify external
filename in call to open() and recompile
program
• Both these problems can be avoided by
assigning filename to string variable
611 18200 計算機程式語言 Lecture 8-21
國立臺灣大學生物機電系
Embedded and Interactive Filenames
 Program 8.3b
#include <iostream>
#include <fstream>
#include <cstdlib>
// needed for exit()
#include <string>
using namespace std;
int main()
{
string filename;
ifstream inFile;
cout << "Please enter the name of the file you wish to open: ";
cin >> filename;
inFile.open(filename.c_str()); // open the file
if (inFile.fail()) // check for successful open
{
cout << "\nThe file named " << filename << " was not successfully opened"
<< "\n Please check that the file currently exists."
<< endl;
exit(1);
}
cout << "\nThe file has been successfully opened for reading.\n";
return 0;
}
611 18200 計算機程式語言 Lecture 8-22
國立臺灣大學生物機電系
Closing a File
• File is closed using close() method
• This method breaks connection between file’s
external name and file stream, which can be
used for another file
• Because all computers have limit on maximum
number of files that can be open at one time,
closing files no longer needed makes good
sense
• Any open files existing at end of normal program
execution are closed automatically by OS
611 18200 計算機程式語言 Lecture 8-23
國立臺灣大學生物機電系
Reading and Writing
Character-Based Files
• Program 8.4 output:
– File named prices.dat is created and saved by
computer as text file (the default file type)
– prices.dat is sequential file consisting of the
following data:
Mats 39.95
Bulbs 3.22
Fuses 1.08
– Actual storage of characters in file depends on
character codes used by computer
– Output file contains 36 characters (Figure 8.2)
611 18200 計算機程式語言 Lecture 8-24
國立臺灣大學生物機電系
Reading and Writing
Character-Based Files
Figure 8.2 The prices.dat File as Stored by the Computer
611 18200 計算機程式語言 Lecture 8-25
國立臺灣大學生物機電系
Reading from a Text File
• Almost identical to reading data from standard
keyboard
– cin object replaced by ifstream object
declared in program
• Example: The input statement
inFile >> descrip >> price;
reads next two items in file and stores them in
variables descrip and price
– File stream name directs input to come from file
stream rather than standard input device stream
611 18200 計算機程式語言 Lecture 8-26
國立臺灣大學生物機電系
Reading from a Text File
• Program 8.5 illustrates how the prices.dat
file created in Program 8.4 can be read
– Also illustrates method of detecting end-of-file
(EOF) marker using good() function (see Table
8.2)
• Other methods that can be used for stream input
are listed in Table 8.3
– Each method must be preceded by stream object
name
611 18200 計算機程式語言 Lecture 8-27
國立臺灣大學生物機電系
Reading from a Text File
 Program 8.5
#include <iostream>
#include <fstream>
#include <cstdlib>
// needed for exit()
#include <string>
using namespace std;
int main()
{
string filename = "prices.dat"; // put the filename up front
string descrip;
double price;
ifstream inFile;
inFile.open(filename.c_str());
if (inFile.fail()) // check for successful open
{
cout << "\nThe file was not successfully opened"
<< "\n Please check that the file currently exists."
<< endl;
exit(1);
}
611 18200 計算機程式語言 Lecture 8-28
國立臺灣大學生物機電系
Reading from a Text File
 Program 8.5 (Continued)
// read and display the file's contents
inFile >> descrip >> price;
while (inFile.good()) // check next character
{
cout << descrip << ' ' << price << endl;
inFile >> descrip >> price;
}
inFile.close();
return 0;
}
611 18200 計算機程式語言 Lecture 8-29
國立臺灣大學生物機電系
Reading from a Text File
Table 8.3 fstream Methods
611 18200 計算機程式語言 Lecture 8-30
國立臺灣大學生物機電系
Standard Device Files
• C++ supports logical and physical file objects
– Logical file object: Stream that connects file of
logically related data (data file) to a program
– Physical file object: Stream that connects to
hardware device such as keyboard or printer
• Standard input file: Physical device assigned
to program for data entry
• Standard output file: Physical device on which
output is automatically displayed
611 18200 計算機程式語言 Lecture 8-31
國立臺灣大學生物機電系
Other Devices
• The keyboard, display, error reporting, and
logging streams are automatically connected to
the stream objects named cin, cout, cerr,
clog
– Requires iostream header file
• Other devices can be used if the name assigned
by system is known
– Example: Most personal computers assign name
prn to printer connected to computer
– Statement outFile.open("prn") connects
printer to ofstream object named outFile
611 18200 計算機程式語言 Lecture 8-32
國立臺灣大學生物機電系
Random File Access
• File access: Refers to process of retrieving data
from a file
• Two types of file access
– Sequential file access
– Random file access
• File organization: Refers to the way data is
stored in a file
• The files you have used and will continue to use
have a sequential organization, meaning
characters in file are stored in a sequential
manner
611 18200 計算機程式語言 Lecture 8-33
國立臺灣大學生物機電系
Random File Access
• Each open file has been read in a sequential
manner, meaning characters are accessed one after
another, which is called sequential access
• Although characters are stored sequentially, they
don’t have to be accessed in same way
• In random access, any character in opened file can
be read without having to read all characters stored
ahead of it first
• To provide random access, each ifstream
object creates a file position marker automatically
• This markers is a long integer representing an
offset from the beginning of file
611 18200 計算機程式語言 Lecture 8-34
國立臺灣大學生物機電系
Random File Access
Table 8.4 File Position Marker Methods
611 18200 計算機程式語言 Lecture 8-35
國立臺灣大學生物機電系
Random File Access
• seek() method allows programmer to move to
any position in file
• Character’s position is referred to as its offset
from the start of file
611 18200 計算機程式語言 Lecture 8-36
國立臺灣大學生物機電系
Random File Access
 Program 8.7
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
string filename = "test.dat";
char ch;
long offset, last;
ifstream inFile(filename.c_str());
if (inFile.fail())
// check for successful open
{
cout << "\nThe file was not successfully opened"
<< "\n Please check that the file currently exists"
<< endl;
exit(1);
}
611 18200 計算機程式語言 Lecture 8-37
國立臺灣大學生物機電系
Random File Access
 Program 8.7 (Continued)
inFile.seekg(0L,ios::end);
last = inFile.tellg();
// move to the end of the file
// save the offset of the last character
for(offset = 1L; offset <= last; offset++)
{
inFile.seekg(-offset, ios::end);
ch = inFile.get();
cout << ch << " : ";
}
inFile.close();
cout << endl;
return 0;
}
611 18200 計算機程式語言 Lecture 8-38
國立臺灣大學生物機電系
File Streams as Function Arguments
• A file steam object can be used as a function
argument
• The function’s formal parameter must be a
reference to the appropriate stream, either
ifstream& or ofstream&
– Examples: inOut(), getOpen()
611 18200 計算機程式語言 Lecture 8-39
國立臺灣大學生物機電系
A Case Study: Pollen Count File Update
• After a data file has been created, application
programs are typically written to read and
update the file with current data
• In this case study, a file is used as a database
storing the ten most recent polling counts, which
are used in the summer as allergy “irritability”
measures
–
–
–
–
Analyze the problem
Develop a solution
Code the solution
Test and correct the program
611 18200 計算機程式語言 Lecture 8-40
國立臺灣大學生物機電系
A Closer Look: The iostream Class Library
• Classes in iostream class library access files
by using entities called streams
• For most systems the data bytes transferred on
a stream represent ASCII characters or binary
numbers
• Mechanism for reading a byte stream from a file
or writing a byte stream to a file is hidden when
using a high level language like C++
611 18200 計算機程式語言 Lecture 8-41
國立臺灣大學生物機電系
File Stream Transfer Mechanism
Figure 8.5 The data transfer mechanism
611 18200 計算機程式語言 Lecture 8-42
國立臺灣大學生物機電系
Components of the iostream Class Library
• iostream class library consists of two primary
base classes
– streambuf
– ios
• streambuf class provides the file buffer
• ios class contains pointer to the file buffers
provided by streambuf class and general
routines for transferring text data
611 18200 計算機程式語言 Lecture 8-43
國立臺灣大學生物機電系
Components of the iostream Class Library
Figure 8.6 The base class ios and its derived classes
611 18200 計算機程式語言 Lecture 8-44
國立臺灣大學生物機電系
Components of the iostream Class Library
Figure 8.7 The base class streambuf and its derived classes
611 18200 計算機程式語言 Lecture 8-45
國立臺灣大學生物機電系
Components of the iostream Class Library
Table 8.5 Correspondence Between Classes in Figures 8.6 and 8.7
611 18200 計算機程式語言 Lecture 8-46
國立臺灣大學生物機電系
In-Memory Formatting
• In addition to classes shown in Figure 8.7, a
class named strstream is derived from ios
class
– Uses strstream class shown in Figure 8.7, requires
strstream header file, and provides capabilities for
writing and reading to and from in-memory defined
streams
• As output, these streams are typically used to
“assemble” a string from a smaller pieces until a
complete line of characters is ready to be written
to cout or to a file
611 18200 計算機程式語言 Lecture 8-47
國立臺灣大學生物機電系
In-Memory Formatting
• strstream object can also be opened in input
mode
– This stream is used as working storage area,
or buffer, for storing complete line of text from
file or standard input
– After buffer has been filled, and extraction
operator is used to “disassemble” the string
into component parts and convert each data
item into its designated data type
611 18200 計算機程式語言 Lecture 8-48
國立臺灣大學生物機電系
Common Programming Errors
• Forgetting to open file before attempting to read
from it or write to it
• Using file’s external name in place of internal file
stream name when accessing a file
• Opening file for output without first checking that
file with the same name already exists
– Opening existing file for output overwrites that file
• Not understanding that end of file is detected
only after EOF marker has been read and
passed over
611 18200 計算機程式語言 Lecture 8-49
國立臺灣大學生物機電系
Common Programming Errors
• Attempting to detect end of file by using
character variables for EOF marker
– Any variable used to accept EOF marker must
be declared an integer variable
• Using integer argument with seekg() and
seekp() functions
– This offset must be long integer constant or
variable
611 18200 計算機程式語言 Lecture 8-50
國立臺灣大學生物機電系
Summary
• Data file is any collection of data stored together in
an external storage medium under a common name
• Data file is connected to file stream by using
fstream open method
• File can be opened in input and output mode
• All file streams must be declared as objects of
ifstream or ofstream class
• In addition to any files opened in a function,
standard stream objects cin, cout, and cerr are
declared and opened automatically when a program
runs
611 18200 計算機程式語言 Lecture 8-51
國立臺灣大學生物機電系