samedi 28 février 2015

C++: file.seekg does not behave correctly if the ifstream is passed to a function in a different file

I am trying to backup a line in an ifstream. file.tellg() is returning a value I was not expecting. In the example bellow, after reading the first line (a string length of 15 characters) I expected file.tellg() to return 16. Instead, it is returning 41. Could someone please provide some insights on this behavior?


test.cpp



#include <fstream>
#include <ios>
#include <string>
#include <iostream>
using namespace std;

int main(){
ifstream file("sample.ics", ios::in);

string line;
string key0;
string key1;
string value0;
string value1;

getline(file, line, '\n');

cout << "line = " << line << endl;
cout << "line.length = " << line.length() << endl; // should be 15;

cout << "Attempt:" << endl;
int pos = file.tellg(); // should be 16;
cout << " pos = " << pos << endl;

getline(file, key0, ':');
getline(file, value0, '\n');

cout << " First:" << endl;
cout << " " << key0 << ":" << value0 << endl;

cout << " backing up..." << endl;
file.seekg(pos, ios_base::beg);

getline(file, key1, ':');
getline(file, value1, '\n');

cout << " Second:" << endl;
cout << " " << key1 << ":" << value1 << endl;

file.close();
}


Output:



line = BEGIN:VCALENDAR
line.length = 15
Attempt:
pos = 41
First:
CALSCALE:GREGORIAN
backing up...
Second:
ION:2.0


sample.ics



BEGIN:VCALENDAR
CALSCALE:GREGORIAN
VERSION:2.0
METHOD:PUBLISH
...

Aucun commentaire:

Enregistrer un commentaire