C++ file i/o is tougher than c file i/o. So in c++, creating a new library for file i/o is useful or not? I mean Can anyone pls tell are there any benefits in c++ file i/o ?
Lots. Drawbacks too. See C++ language FAQ for details. In short: type-safety and user-defined types.
std::ifstream and std::ofstream are already in stl library. You don't have to create your own.
The main benefit is all outputs and inputs are type safety.
C and C++ are two different languages. C++ file io takes some time getting used to, but once you are using algorithms, exceptions etc they tend to fall into place very naturally.
Opinion
I don't know of any real project that uses C++ streams. They are too slow and difficult to use. There are several newer libraries like FastFormat and the Boost version that claim to be better there was a piece in the last ACCU Overload magazine about them. Personally I have used the c FILE library for the last 15 years or so in C++ and I can see no reason yet to change.
Speed
Here is small test program (I knock together quickly) to show the basic speed problem:
#include <stdio.h>
#include <time.h>
#include<iostream>
#include<fstream>
using namespace std;
int main( int argc, const char* argv[] )
{
const int max = 1000000;
const char* teststr = "example";
int start = time(0);
FILE* file = fopen( "example1", "w" );
for( int i = 0; i < max; i++ )
{
fprintf( file, "%s:%d\n", teststr, i );
}
fclose( file );
int end = time(0);
printf( "C FILE: %ds\n", end-start );
start = time(0);
ofstream outdata;
outdata.open("example2.dat");
for( int i = 0; i < max; i++ )
{
outdata << teststr << ":" << i << endl;
}
outdata.close();
end = time(0);
printf( "C++ Streams: %ds\n", end-start );
return 0;
}
And the results on my PC:
C FILE: 5s
C++ Streams: 260s
Process returned 0 (0x0) execution time : 265.282 s
Press any key to continue.
As we can see just this simple example is 52x slower. I hope that there are ways to make it faster!
NOTE: changing endl to '\n' in my example improved C++ streams making it only 3x slower than the FILE* streams (thanks jalf) there may be ways to make it faster.
Difficulty to use
I can't argue that printf() is not terse but it is more flexible (IMO) and simpler to understand, once you get past the initial WTF for the macro codes.
double pi = 3.14285714;
cout << "pi = " << setprecision(5) << pi << '\n';
printf( "%.5f\n", pi );
cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n';
printf( "%+.3f\n", pi );
cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );
The Question
Yes, may be there is need of a better C++ library, many be FastFormat is that library, only time will tell.
dave
Please have a look at
http://www.ddj.com/cpp/184403651
then You will prefer C++ I/O than C I/O.
in short C is prefered if you know data size prior to read or write and for speed. C++ is prefered if you don't know data size and for efficient code.
In response to David Allan Finch's answer, I fixed an error in his benchmarking code (he flushed the stream in the C++ version after every single line), and reran the test:
The C++ loop now looks like this:
start = time(0);
{
ofstream outdata("example2.txt");
for( int i = 0; i < max; i++ )
{
outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
}
}
end = time(0);
I run 10000000 iterations (10 times more than in the original code, because otherwise, the numbers are just too small for time()'s lousy resolution to give us anything meaningful)) And the output is:
G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s
MSVC9.0:
C FILE: 10s
C++ Streams: 23s
(note, the MSVC version was run on my laptop with a significantly slower harddrive)
But this gives us a performance difference of 1.5-2.3x, depending on the implementation. and other external factors.