|< C++ Formatted I/O 2 | Main | C++ File I/O 2 >| Site Index | Download |


 

 

 

 

MODULE 19: C++ FILE I/O 1

----------------------------------------------------------------------------------------

MODULE 9: C FILE INPUT OUTPUT

 

 

 

 

 

My Training Period: xx hours

 

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.

 

The C++ file input/output programming skills:

 

 

 

 

 

 

 

 

 

 

 

 

 

19.1  Introduction

  • The idea about the stream has been explained extensively in C file I/O and C++ formatted I/O also has been explained in C++ Formatted I/O.

  • A file just a collection of related data that treated by C++ as a series of bytes.

  • By the way, streams move in one way and in serial fashion from receiver and sender.

  • Other than files on disk, devices such as magnetic tapes, primary or secondary storage devices, printers and networks that carrying data are also treated as files.

  • File I/O is one of the interesting topics in C / C++ because of the wide applications.  We need to write to disk when we do software installation, writing windows registry, read, write, delete, update file contents, sending and receiving data through networks (sockets) etc.

  • The include files needed in order to use the disk file I/O class objects are: <iostream> and <fstream>iostream contains standard input output objects such as cin, cout, cerr and clog (refer to C++ Formatted I/O).

  • Keep in mind that new header files which are fully C++ standard compliance that using template based header files (ISO/IEC C++) don’t have the .h anymore.  You can read the story in Namespaces.

  • Furthermore same as in C File I/O, all the program examples don’t consider the file access permissions.  Normally, file access permissions are combined with the user permissions and rights as security features of the Operating Systems.  They are implementation dependant and the discussion can be found in Windows Win32 programming tutorial.

  • For C++, all file objects belong to the one of the following classes:

Class

Brief description

ifstream

Objects belong to this class are associated with files opened for input purposes.

ofstream

Objects belong to this class are associated with files opened for output purposes.

fstream

Objects belong to this class are associated with files opened for input and output purposes.

 

Table 19.1:  File input/output classes.

  • These classes are defined in <fstream> header file.

  • Data files are attached with files objects using the open() member function of the file object.

  • The open() prototype is:

void      open(const char *name, int mode, int access);

  • Where:

  1. name is the filename.

  2. Open file modes (flags) are used to indicate what to do to the file (e.g. open, close) and the data (e.g. read, write).  The flags can be logically ORed.  Mode must be one of the following:

 

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

  1. 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

ifstream  theinputfile;

ofstream  theoutputfile;

theinputfile.open("testfileio.dat ");

theinputfile.open("c:\\testfileio.dat ");

theinputfile.open("testfileio.dat ", ios::in | ios::binary);

theinputfile.open("testfileio.dat ", ios::in | ios::ate, 0);

theoutputfile.open("testfileio.dat");

theoutputfile.open("c:\\testfileio.dat ");

theoutputfile.open("testfileio.dat", ios::out | ios::app);

theoutputfile.open("testfileio.dat", ios::out | ios::nocreate, 0);

theinputfile.close();

theoutputfile.close();

#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

      }

...

if(inputfile.bad())

{

      cerr<<"Unable to open testfileio.dat\n";

      exit(1); // 0 – normal exit, non zero – some error

}

 

  • The following examples created for Win32 empty console application without .def (definition) and .rc (resource) files.  All examples in this Module have been tested using Borland 5.xx ONLY.

  • At the end of this Module, there are program examples compiled with VC++/VC++ .Net and g++ for Linux.

  • Keep in mind that in Microsoft Windows operating system environment there are another layer of security for accessing Windows objects.  The information of the Windows security features can be found in Win32 SDK documentation.  This Module will only discuss file input/output in general from C++ programming perspective.

  • Firstly, create a file named sampleread.txt at root on C: drive (or other location provided you explicitly state the full path in the program).  Write some text as shown below in sampleread.txt file and save it.

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();

}

 

Output:

 

C++ file I/O program example

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:

 

C++ file I/O getline() program example

 // 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";

}

 

Output:

 

C++ file I/O with exception program example

C++ file I/O program example

  // 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…

 

Output:

 

C++ file I/O program example

 

 

19.2  Sequential File Processing

100.23  56.33  67.12 89.10 55.45

23.12  56.11  43.24  65.32  45.00

// 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";

       }

 }

 

Output:

 

C++ file I/O sequential external data program example

// 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";

}

}

 

Output:

 

C++ file I/O process external 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 

Writing some data in this file

------------------------------

0  1  2  3  4  5  6  7  8  9  10 

 

tenouk fundamental of C++ object oriented tutorial

 

 

 

 

 

 

 

 

 

 

 

 

Further C++ file input/output reading:

 

  1. The source code for this Module is C++ File I/O source codes.

  2. Check the best selling C/C++, Object Oriented and pattern analysis books at Amazon.com.

  3. Visual C++ .NET programming tutorials.

 

 

 

 

 

 

|< C++ Formatted I/O 2 | Main | C++ File I/O 2 >| Site Index | Download |


C++ File Input/Output:  Part 1 | Part 2