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;
}
Ниже приведен вывод: -
изображения 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()
будет соответствовать различным позициям в файле.