ifstream tellg() не возвращает правильное положение

код выглядит следующим образом :

Код:

#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    myfile >> id;
    cout << myfile.tellg(); //return 16? but not 7 or 8
    cout << id ;

    return 0;
}

Содержимое Файла:

1800567
Ho Rui Jang
21
Female
Malaysian
012-4998192
20 , Lorong 13 , Taman Patani Janam
Melaka
Sungai Dulong

Проблема :

1.) Я ожидаю tellg() либо возвратить 7 или 8 С первой строки 1800567 что 7 цифр, поэтому указатель потока должен быть помещен после этого числа и перед строкой "Ho Rui Jang", а tellg() возвращает 16. Почему? так ли это?

3 ответов


Это больше похоже на ошибку компилятора (возможно, gcc)

со следующим кодом: -

#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    cout << myfile.tellg()<<endl;
    myfile >> id;
    streamoff pos=myfile.tellg();
    cout <<"pos= "<<pos<<'\n';
    cout <<"id= " << id<<'\n' ;
    return 0;
}

Ниже приведен вывод: -

Bug

изображения inpstr.exe было создано Visual studio's cl пока inp.exe С g++(gcc version 4.6.1 (tdm-1))


была такая же проблема. попробуйте прочитать двоичный файл filestream:

    ifstream myfile("savingaccount.txt",ios::binary);

это помогло мне


Это не ошибка компилятора. tellg() не гарантируется возврат смещения с начала файла. Есть минимальный набор гарантий, например, если возвращаемое значение tellg() перешло к seekg(), указатель файла будет располагаться в соответствующей точке файла.

на практике, под unix,tellg() возвращает смещение от начала файла. В windows он возвращает смещение от начала файла, но только если файл открыт в двоичный режим.

но единственная реальная гарантия заключается в том, что разные значения возвращаются из tellg() будет соответствовать различным позициям в файле.