Search code examples
c++fileio

C++ and C file I/O


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 <fstream> Can anyone please tell are there any benefits in C++ file I/O ?


Solution

  • 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, may be FastFormat is that library, only time will tell.

    dave