----------------------------------------------------------------------------------------
Note: The examples in this Module were compiled and run using Win32 empty console application without .def (definition) and .rc (resource) files (Borland®). All program examples have been tested using Borland C++ 5.xx ONLY. It should be OK if you use Win32 empty console application as a target for other compilers because header files used are from C++ Standard Library. For Linux/Unix, you have to concern about the path or directory access because of the different file system. You may need some code modification and been left for your assignments :o). You may consider reading Section 23.3, Namespaces first, for using traditional, fully complied C++ or mixing the C and C++ codes. For C++ and MFC (Windows GUI programming) it is called Serialization and the topics are in Single Document Interface (SDI) and Multiple Document Interface (MDI). The C standard file input/output is discussed in C File Input/Output. The source code for this Module is C++ File I/O source codes.
|
| 19.1 Introduction
void open(const char *name, int mode, int access);
| ||||||||||
| Mode | Description |
| ios::app | Append data to the end of the output file. |
| ios::ate | Go to the end of the file when open. |
| ios::in | Open for input, with open() member function of the ifstream variable. |
| ios::out | Open for output, with open() member function of the ofstream variable. |
| ios::binary | Binary file, if not present, the file is opened as an ASCII file as default. |
| ios::trunc | Discard contents of existing file when opening for write. |
| ios::nocreate | Fail if the file does not exist. For output file only, opening an input file always fails if there is no fail. |
| ios::noreplace | Do not overwrite existing file. If a file exists, cause the opening file to fail. |
|
Table 19.2: File open modes | |
File protection access determines how the file can be accessed. It is Operating System dependent and there are others attributes that are implementation extensions. For DOS® example, it must be one of the following:
| Attributes | Description |
| 0 | Normal file or Archive |
| 1 | Read-only file |
| 2 | Hidden file |
| 4 | System file |
|
Table 19.3: File types | |
To declare the input file stream i.e. for reading we would declare like this:
ifstream theinputfile;
To declare the output file stream i.e. for writing we would declare like this:
ofstream theoutputfile;
Then, to connect to a stream, let say opening file testfileio.dat for reading, the file which located in the same folder as the executable program we would write like this:
theinputfile.open("testfileio.dat ");
Or with the path we could write:
theinputfile.open("c:\\testfileio.dat ");
Next, opening a file for reading and binary type modes, we could write:
theinputfile.open("testfileio.dat ", ios::in | ios::binary);
Another example, opening a file for reading, with normal type access and go to the end of the file, we could write like this:
theinputfile.open("testfileio.dat ", ios::in | ios::ate, 0);
For writing, to connect to a stream, let say opening file testfileio.dat for writing, the file which located in the same folder as the running program. Previous content of the testfileio.dat will be overwritten, we could write like this:
theoutputfile.open("testfileio.dat");
Or with the path:
theoutputfile.open("c:\\testfileio.dat ");
Then, opening a file for writing and appending at the end of the file modes, we could write like this:
theoutputfile.open("testfileio.dat", ios::out | ios::app);
Or opening for writing, check the existing of the file with normal access modes, we could write like this:
theoutputfile.open("testfileio.dat", ios::out | ios::nocreate, 0);
After we have completed the file processing, we have to close or disconnect the stream to free up the resources to be used by other processes or programs. Using the close() member function, for input stream we would write like this:
theinputfile.close();
And for output stream:
theoutputfile.close();
During the opening for reading or writing, we should provide error handling routines to make sure the file operations have completed successfully otherwise some error message should be displayed or error handling routines been executed.
For example we can use fail() member function:
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
ifstream inputfile;
inputfile.open("testfileio.dat");
if(inputfile.fail())
{
cout<<"The file could not be opened!\n";
exit(1); // 0 – normal exit, non zero – some error
}
...
Or bad() with cerr.
if(inputfile.bad())
{
cerr<<"Unable to open testfileio.dat\n";
exit(1); // 0 – normal exit, non zero – some error
}
This is file sampleread.txt. This file will be opened for reading then its content will be written to another file and standard output i.e screen/console...after you have executed this C++ program, without error....this text should be output on your screen as well as written to the samplewrite.txt file. Don't forget to check the content of the samplewrite.txt.
sampleread.txt file content |
// reading from available file content
// then writing the content to another
// file. Firstly, create file for reading (can include path)
// let says "C:\sampleread.txt", at root on C drive.
// Type some text as shown, then executes this program.
#include <iostream>
#include <fstream>
using namespace std;
// function definition, to open file for reading...
void openinfile(ifstream &infile)
{
char filename[100];
cout<<"Enter the file name: ";
// Enter the filename that you have created
// (can include path). From the comment above
// you have to enter "C:\sampleread.txt" without the double quotes.
cin>>filename;
infile.open(filename);
}
void main(void)
{
// declare the input file stream
ifstream inputfile;
// declare the output file stream
ofstream outputfile;
char chs;
// function call for opening file for reading...
openinfile(inputfile);
// create, if not exist and open it for writing
outputfile.open("C:\\samplewrite.txt");
// test until the end of file
while (!inputfile.eof())
{
// read character until end of file
inputfile.get(chs);
if (!inputfile.eof())
{
// output character by character (byte) on screen, standard output
cout<<chs;
// write to output file, samplewrite.txt
outputfile<<chs;
}
}
cout<<"\nReading and writing file is completed!"<<endl;
// close the input file stream
inputfile.close();
// close the output file stream
outputfile.close();
}

In this program we do not provide error handlings, the existing file to be opened is not verified.
Another example using getline() member function. Firstly create text file, named readfile.txt, put it on drive C: Windows, then type the following sample text and save it.
This is readfile.txt. Just sample text, opening
for reading by using getline() member function.
There are four lines of text to be read from.
This is just plain simple reading text from a file.
// using getline() member function
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[50];
ifstream inputfile;
char FirstLine[50];
char SecondLine[50];
char ThirdLine[50];
// prompt user for file name to be opened...
cout<<"Enter the filename to be opened: ";
cin>>filename;
// test open file for reading...
inputfile.open(filename);
// if not the end of file, do...
if(!inputfile.eof())
{
cout<<"\nThe first line of text is: \n";
inputfile.getline(FirstLine, 50);
cout<<FirstLine<<'\n';
cout<<"The second line of text is: \n";
inputfile.getline(SecondLine, 50);
cout<<SecondLine<<endl;
cout<<"The third line of text is: \n";
inputfile.getline(ThirdLine, 50);
cout<<ThirdLine<<endl;
}
}
Output:

Another program example with a simple exception handling.
// a simple file ‘exception handling’ when opening file for reading.
// There is no testfileio.txt at the root of drive C at the beginning.
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[ ] = "C:\\testfileio.txt";
ifstream inputfile;
inputfile.open(filename, ios::in);
// test if fail to open fail for reading, do…
if(inputfile.fail())
{
cout<<"Opening "<<filename<<" file for reading\n";
cout<<"---------------------------------------\n";
cout<<"The "<<filename<<" file could not be opened!\n";
cout<<"Possible errors:\n";
cout<<"1. The file does not exist.\n";
cout<<"2. The path was not found.\n";
system("pause");
exit(1); // just exit
// 0-normal, non zero - some error
}
// if successful opening file for reading, do…
else
{
cout<<"The "<<filename<<" file was opened successfully!\n";
cout<<"\nDo some file processing here...\n";
}
inputfile.close();
// test if fail to close the file, do…
if(inputfile.fail())
{
cout<<"\nThe file "<<filename<<" could not be closed!\n";
system("pause");
exit(1);
}
// else, do…
else
cout<<"\nThe "<<filename<<" file was closed successfully!\n";
}

Then, create file named testfileio.txt on drive C:. Re-run the program, the following should be output.

Same routine can be use for file output ofstream, by replacing the ifstream objects.
The following example shows you how to prompt user for the file name.
// prompting user for filename to be opened others should be
// same as the previous example.
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[100];
ifstream inputfile;
// prompting user for filename to be opened…
// including the full path if necessary…
// e.g. c:\testfileio.txt, c:\Windows\Temp\testfile.txt etc
cout<<"Enter the file name to be opened: ";
// store at an array filename...
// array without [ ] is a pointer to the
// first array’s element...
cin>>filename;
// opened the file for input...
inputfile.open(filename, ios::in);
// test if fail to open file for reading, do…
if(inputfile.fail())
{
cout<<"Opening "<<filename<<" file for reading\n";
cout<<"---------------------------------------\n";
cout<<"The "<<filename<<" file could not be opened!\n";
cout<<"Possible errors:\n";
cout<<"1. The file does not exist.\n";
cout<<"2. The path was not found.\n";
exit(1); // just exit
// 0-normal, non zero - some error
}
// if successful opening file for reading, do…
else
{
cout<<"The "<<filename<<" file was opened successfully!\n";
cout<<"\nDo some file processing here...\n";
}
// close file for input…
inputfile.close();
// test if fail to close the file, do…
if(inputfile.fail())
{
cout<<"\nThe file "<<filename<<" could not be closed!\n";
exit(1);
}
// else, do…
else
cout<<"\nThe "<<filename<<" file was closed successfully!\n";
}
// tested using the win32 console mode........
// provided the file testfileio.txt exists on the C: drive…

Reading data and do some calculation, then display the data. Firstly, create a file named testfileio1.txt on drive C:. Key in some data in this test file as shown below and save the file.
100.23 56.33 67.12 89.10 55.45
23.12 56.11 43.24 65.32 45.00
Create and run the following program.
// a simple processing data from external file.
// read the data in sequential mode, do some
// calculation and display to the standard output.
// Create file testfileio1.txt on drive C, and type some data as shown
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[] = "C:\\testfileio1.txt";
ifstream inputfile;
// opening input file for reading
inputfile.open(filename, ios::in);
// test if fail to open the file, do…
// error handling for file opening
if(inputfile.fail())
{
cout<<"Opening file "<<filename<<" for reading\n";
cout<<"------------------------------------------\n";
cout<<"The file could not be opened!\n";
cout<<"Possible errors:\n";
cout<<"1. The file does not exist.\n";
cout<<"2. The path was not found.\n";
system("pause");
exit(1); // just exit
// 0-normal, non zero - some error
}
// if successful, do the following...
else
{
cout<<"The "<<filename<<" file was opened successfully!\n";
// declare some variables for simple calculation
float price, total = 0;
int count = 0;
cout<<"Reading data and do some calculation\n\n";
// read data from input stream...
inputfile>>price;
// test, if end of file not found, do the following...
while(!inputfile.eof())
{
// total = total + price
total += price;
count++;
cout<<"Item price # "<<count<<" is "<<price<<endl;
// re-read the next item price within the loop
inputfile>>price;
}
cout<<"The total price for "<<count<<" items is: "<<total<<endl;
cout<<"\n-------DONE-------\n"<<endl;
// close the input file
inputfile.close();
// test closing file, if fail to close the file, do...
// error handling for file closing
if(inputfile.fail())
{
cout<<"The "<<filename<<" file could not be closed!\n";
// something wrong, just exit...
exit(1);
}
// if successful close the file, do....
else
cout<<"The "<<filename<<" file was closed successfully!\n";
}
}

Now let try using the ostream class object. This will create and open a file for writing. The file will be created if it does not exist yet.
// a simple processing data from external file.
// Creating, opening and writing some data in file
// and appending data at the end of file...
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[ ] = "C:\\testfileio2.txt";
ofstream outputfile;
// creating, opening and writing/appending data to file
outputfile.open(filename, ios::out|ios::app);
// simple error handling for file creating/opening for writing
// test if fail to open the file, do…
if(outputfile.fail())
{
cout<<"Creating and opening file "<<filename<<" for writing\n";
cout<<"------------------------------------------\n";
cout<<"The "<<filename<<" file could not be created/opened!\n";
cout<<"Possible errors:\n";
cout<<"1. The file does not exist.\n";
cout<<"2. The path was not found.\n";
exit(1); // just exit
// 0-normal, non zero - some error
}
// else, if the file can be opened, do…
else
{
cout<<"The "<<filename<<" file was created and opened successfully!\n";
cout<<"\nDo some file writing....\n\n";
outputfile<<"Writing some data in this file\n";
outputfile<<"------------------------------\n";
cout<<"Check the "<<filename<<" file contents :-)"<<endl;
cout<<"If the file already have had data, the new data will be appended\n";
int sampledata;
// write some integers to the file...
for(sampledata=0; sampledata<=10; sampledata++)
outputfile<<sampledata<<" ";
outputfile<<endl;
// close the output file
outputfile.close();
// test if fail to close the file, do the following...
// simple error handling for output files closing
if(outputfile.fail())
{
cout<<"The "<<filename<<" file could not be closed!\n";
exit(1);
}
// test if successful to close the file, do the following...
else
cout<<"\nThe "<<filename<<" file was closed successfully!\n";
}
}

The content of the testfileio2.txt is as follows:
Writing some data in this file
------------------------------
0 1 2 3 4 5 6 7 8 9 10
When you re run this program second times, the data will be appended at the end of the pervious data.
Writing some data in this file
------------------------------
0 1 2 3 4 5 6 7 8 9 10
Writing some data in this file
------------------------------
0 1 2 3 4 5 6 7 8 9 10
tenouk fundamental of C++ object oriented tutorial
The source code for this Module is C++ File I/O source codes.
Check the best selling C/C++, Object Oriented and pattern analysis books at Amazon.com.