С++: file.seekg() не возвращает текущее местоположение

Я пытаюсь сделать резервную копию строки в ifstream. file.tellg() возвращает значение, которого я не ожидал. В приведенном ниже примере после прочтения первой строки (строка длиной 15 символов) я ожидал, что file.tellg() вернет 16. Вместо этого он возвращает 41. Может ли кто-нибудь дать некоторое представление об этом поведении?

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();
}

Вывод:

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

образец .ics

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

person ChrisMcJava    schedule 28.02.2015    source источник
comment
std::istream::tellg() возвращает не int, а std::streampos: вы пытались использовать этот тип для восстановления местоположения?   -  person Dietmar Kühl    schedule 28.02.2015
comment
Я попробовал код выше. На моем ПК это pos = 16   -  person Andrey Derevyanko    schedule 28.02.2015
comment
Может быть проблема совместимости с окончанием строки. См. это, это и это.   -  person Anmol Singh Jaggi    schedule 01.03.2015
comment
streampos по-прежнему 41. и происходит тот же результат   -  person ChrisMcJava    schedule 01.03.2015


Ответы (1)


Попробуйте открыть файл в двоичном режиме и посмотрите, получите ли вы такие же результаты:

файл ifstream("sample.ics", ios::binary);

person user4644    schedule 01.03.2015
comment
открытие в двоичном режиме может испортить чтение файла как текста, хотя - person M.M; 01.03.2015
comment
все нормально. вы должны использовать std::streampos вместо int хотя - person ChrisMcJava; 01.03.2015