#include <string>
#include <iostream>
#include <fstream>

int main()
{
    filebuf fb;
    istream ifile(&fb);
    ostream ofile(&fb);

    fb.open( "local.db", ios::in | ios::out);

    if ( ifile )
    {
        cout << "file opened" << endl;

        string s; 

        /* class streambuf  -> controlling input/output for a file
         * six pointers:
         *      beg, curr, end  of input and output stream
         * streamoff   ->       fseek, ftell   represented as long
         * streampos   ->  describing position in the file (fpos_t in <stdio.h>)
         * streampos += streamoff
         */

        // strstreambuff:: seekoff
        //
        streampos spos  = fb.pubseekoff(0, ios::beg); 
        streampos sprev = spos;
        while ( getline( ifile, s) )
        {
            cout << sprev << " : ";
            cout << spos << " : ";
            cout << s << endl;
            sprev = spos;
            spos = fb.pubseekoff(0, ios::cur);
        }
        long where_to_pos = 17;
        fb.pubseekoff(where_to_pos, ios::beg);
        ifile.clear();
        if ( getline( ifile, s) )
        {
            cout << where_to_pos << " : ";
            cout << s << endl;
        }
        else
            cerr << "last line" << endl;
        
    }
    else
        cout << "error" << endl;
    return 0;    
}