------------------------------------------------------------------------------------------
| 19.3 Random File Processing
istream& seekg(streampos pos); istream& seekg(streamoff off, ios_base::seekdir dir);
// using seekg() #include <iostream> #include <fstream> using namespace std;
void main(void) { char filename[] = "C:\\testfileio3.txt"; fstream inputfile, outputfile;
// create, open and write data to file outputfile.open(filename, ios::out); // write some text outputfile<<"This is just line of text."<<endl; // close the output file outputfile.close(); // opening and reading data from file inputfile.open(filename, ios::in); // a simple error handling for files creating/opening for writing if(inputfile.fail()) { cout<<"Opening "<<filename<<" file for reading\n"; cout<<"------------------------------------------\n"; cerr<<"The file "<<filename<<" could not be created/opened!\n"; cerr<<"Possible errors:\n"; cerr<<"1. The file does not exist.\n"; cerr<<"2. The path was not found.\n"; exit(1); // just exit // 0-normal, non zero - some error } else { cout<<"The "<<filename<<" file was opened successfully!\n"; cout<<"\nMove the pointer to the end\n" <<"Then back to the beginning with\n" <<"10 offset. The pointer now at...\n"<<endl; // flush the stream buffer explicitly... cout<<flush; // get length of file int length; char * buffer;
// move the get pointer to the end of the stream inputfile.seekg(0, ios::end); // the tellg() member function returns the current stream position. // there is 27 characters including white space length = inputfile.tellg(); // move back the pointer to the beginning with offset of 10 inputfile.seekg(10, ios::beg); // dynamically allocate some memory storage for type char... buffer = new char [length]; // read data as block from input file... inputfile.read(buffer, length); cout<<buffer<<endl; // free up the allocated memory storage... delete[ ] buffer; // close the input file inputfile.close(); // a simple error handling for output files closing // test if fail to close the file, do... if(inputfile.fail()) { cerr<<"The "<<filename<<" file could not be closed!\n"; exit(1); } // test if successful to close the file, do... else cout<<"\nThe file "<<filename<<" was closed successfully!\n"; } }
Output: |
We can set position of the put pointer by using seekp(). The prototype are:
ostream& seekp(streampos pos);
ostream& seekp(streamoff off, ios_base::seekdir dir);
These will set the position of the put pointer. Theput pointer determines the next location where to write in the buffer associated to the output stream. The parameters:
seekp() parameter | Brief description |
pos | The new position in the stream buffer of type streampos object. |
off | Value of type streamoff indicating the offset in the stream's buffer. It is relative todirparameter. |
dir | Seeking direction. An object of typeseekdir that may take any of the following values:
|
Table 19.5: seekp() parameter. |
Try the following seekp() program example:
// using seekp()
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[ ] = "C:\\testfileio4.txt";
ofstream outputfile;
// creating, opening and writing data to file
outputfile.open(filename, ios::out);
// simple error handling for file creating/opening test if fail to open, do...
if(outputfile.fail())
{
cout<<"Creating and opening "<<filename<<" file 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
}
// test if successful in creating/opening the file, do...
else
{
cout<<"The "<<filename<<" file was created and opened successfully!\n";
cout<<"\nDo some file writing....\n\n";
int locate;
outputfile.write("Testing: Just simple example.", 29);
// tell the pointer position...
locate = outputfile.tellp();
// seek the pointer position with offset...
outputfile.seekp(locate-16);
outputfile.write(" rumble", 7);
// close the output file
outputfile.close();
// simple error handling for output files closing
// test if fail to close the file, do...
if(outputfile.fail())
{
cout<<"The "<<filename<<" file could not be closed!\n";
exit(1);
}
// if successful to close the file, do...
else
cout<<"\nThe "<<filename<<" file was closed successfully!\n";
}
}
The content of the testfileio4.txt should be:
Testing: Just rumble example.
We can use the ignore() to extracts characters from input stream and discards them. The prototype:
istream& ignore(streamsize n = 1, int delimter = EOF);
Here, the extraction ends when n characters have been discarded or when delimter is found, whichever comes first. In this last case delimter is also extracted. For example:
// istream ignore()
#include <iostream>
using namespace std;
int main ()
{
char firstword, secondword;
cout<<"Enter your first and last names: ";
firstword = cin.get();
cin.ignore(30,' ');
secondword = cin.get();
cout<<"The initials letters are: "<<firstword<<secondword<<endl;
return 0;
}
// reading from available file content
// then writing the content to another file.
// Firstly, create a file for reading (can include path)
// let says "C:\sampleread.txt", at root on C drive.
// Type some text in the file and save it, then executes this program.
#include <iostream>
#include <fstream>
usingnamespace 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 does 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();
}
Previous example compiled usingg++.
// a simple processing data from external file.
// Read the data in sequential mode, do some
// calculation and display to the standard output.
// Firstly create file testfileio.txt in the current
// working directory and type some int data in it...
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
char filename[ ] = "testfileio.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";
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
// a simple error handling for file closing
if(inputfile.fail())
{
cout<<"The "<<filename<<" couldn't be closed!\n";
exit(1);
}
// if fail, do....
else
cout<<"The "<<filename<<" file closed successfully!\n";
return 0;
}
}
[bodo@bakawali ~]$ g++ fileio.cpp -o fileio
[bodo@bakawali ~]$ ./fileio
The testfileio.txt file was opened successfully!
Reading data and do some calculation
Item price # 1 is 1.22
Item price # 2 is 4.5
Item price # 3 is 12
Item price # 4 is 10.56
Item price # 5 is 23.11
Item price # 6 is 7.8
Item price # 7 is 54.2
Item price # 8 is 30
Item price # 9 is 9.5
Item price # 10 is 45.45
The total price for 10 items is: 198.34
-------DONE-------
The testfileio.txt couldn't be closed!
From the output, the inputfile.fail() is true. Can you find the reason for me?
The following section presents a step-by-step on how to build the previous source code usingVisual C++ 2005 Express Edition (free download) from Microsoft.
First of all we create a new project. This project is Win32 Console Application as shown below.
Fill in the project name in the Name field and you can customize the project location using the Location field.
Click the Next button and select theEmpty Project for the Application Settings and click theFinish button.
In the next step we need to add the C++ source file. Follow the given steps.
----------------------------------------------------------------------------------
Select the Code category and C++ File (.cpp) template. Put the source code filename and you can customize the location as needed. Click the Add button.
Copy and paste the following source code. Take note that you must clean any formatted before pasting it in the editor (you may paste it in unformatted text editor such as WordPad/NotePad and clean any formatted text, then re-copy and re-paste it in the Visual C++ editor)
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{
char filename[100];
ifstream inputfile;
// prompting user for filename to be opened…
cout<<"Enter the file name to be opened: ";
// store in filename, an 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";
}
Build and run your program in Debug mode.
The following shows the output sample.
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.