0

I was looking at seekp and tellp() functionality. In below code, tellp() returns -1 after f2.seekp(10). I could not understand why -1 is returned. This I tested in both compilers (Visual Studio as well as TDM GCC 4.9.2 64 bit) and results are consistent. There is also another post similar to this here and in that case issue seems to be with the compiler and visual studio returns correct results. I raised separate post because issues are different.

/** Open in ate mode. ios::in is used to ensure that file is not destroyed. */
    ofstream f2("h2.txt", ios::ate | ios::out | ios::in);
    if (!f2)   //0 means error. You can also use f1.fail()
    {
        // open failed
        cerr << "cannot open the file\n";
        exit(-1);
    }
    ios::pos_type currentPos = f2.tellp();
    cout << "Initial Write Pointer Position = " << currentPos << endl;
    // Write some data. It should be written at the end.
    f2 << 20;
    currentPos = f2.tellp();
    cout << "Write Pointer Position after write = " << currentPos << endl;

    // Seek to specific position. File pointer must change accordingly.
    f2.seekp(10);
    currentPos = f1.tellp();
    cout << "Write Pointer Position after seek = " << currentPos << endl;

    // Write some data
    f2 << "ABC";
    currentPos = f2.tellp();
    cout << "Final Write Pointer seek and write = " << currentPos << endl;
    f2.close();

Edit: Here is the complete code. There was a mistake in the code and that is why result was incorrect. There is no issue with seekp() in ate mode.

int main()
{
    string file_name;
    int currentPos;
   cout<<"Enter the file name";
    getline(cin,file_name);

    fstream f2(file_name, ios::ate | ios::out | ios::in);
    if (!f2)   //0 means error. You can also use f1.fail()
    {
        // open failed
        cerr << "cannot open the file\n";
    }
    else
    {
        currentPos = f2.tellp();
        cout << "Initial Write Pointer Position = " << currentPos << endl;
        // Write some data. It should be written at the end.
        f2 << 20;
        currentPos = f2.tellp();
        cout << "Write Pointer Position after write = " << currentPos << endl;

        // Seek to specific position. File pointer must change accordingly.
        f2.seekp(10);
        currentPos = f2.tellp();
        cout << "Write Pointer Position after seek = " << currentPos << endl;

        // Write some data
        f2 << "ABC";
        currentPos = f2.tellp();
        cout << "Final Write Pointer seek and write = " << currentPos << endl;
        f2.close();
    }

    return 0;
}
Rajesh
  • 1,085
  • 1
  • 12
  • 25
  • Variable `f1` is not declared. Please replace the posted code with a [mcve] – Mike Kinghan Jan 29 '18 at 10:32
  • You solved my problem. I had copy paste problem from previous code and after correcting it worked and updated code is posted in original post. It was compiling in my case because I had other part of the code as well – Rajesh Feb 02 '18 at 01:18

0 Answers0