ifstream tellg() nu returnează poziția corectă (Programare, C++, Fișier, Fstream)

caramel1995 a intrebat.

read.cpp

#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;
}

savingaccount.txt

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

Problema

Mă aștept ca tellg() să returneze fie 7 fie 8 din moment ce prima linie 1800567 care are 7 cifre, astfel încât pointerul de flux ar trebui plasat după acest număr și înainte de șirul de caractere "Ho Rui Jang", , dar tellg() returnează 16. De ce se întâmplă acest lucru?

Comentarii

  • Este fișierul salvat cu o codificare specială? cu codificarea ANSI pare să funcționeze bine (rapoarte 7) pe Visual Studio 2010 –  > Por lccarrasco.
  • De fapt, datele din interiorul fișierului au fost scrise folosind ofstream , problema există doar atunci când folosesc ofstream pentru a scrie date și din nou codul de mai sus va returna o poziție greșită a tellg(). nu se va întâmpla atunci când fișierul este scris de mână (tastați folosind tastatura) –  > Por caramel1995.
  • Te superi dacă adaugi funcția/metoda care scrie în fișier? dacă funcționează când fișierul este tastat, atunci probabil este o problemă de padding sau ceva de genul ăsta. –  > Por lccarrasco.
  • Pe Windows cu fișierul deschis în modul text, operațiunile de căutare și poziționare sunt eronate. –  > Por Dani.
3 răspunsuri
perilbrain

Asta pare mai degrabă un bug al compilatorului (probabil gcc)

Cu următorul cod:-

#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<<'
';
    cout <<"id= " << id<<'
' ;
    return 0;
}

În continuare este ieșirea:-

În imagine inpstr.exe a fost generată din Visual studio's cl în timp ce inp.exe de la g++(gcc version 4.6.1 (tdm-1))

Comentarii

  • Poate că ar trebui să fie ridicat un bug și să vedem ce răspund. –  > Por perilbrain.
  • Stau aici de 5-6 ore încerc să îmi dau seama care este problema . Se pare că sunt un tip foarte insistent și sunt atât de concentrat în rezolvarea problemei până când nu m-am gândit să o întreb aici până când m-am trezit să-mi iau o cană de lapte. Acum, problema este cauzată de bug-ul gcc –  > Por caramel1995.
  • Am învățat în viața mea…Nu credeți niciodată un lucru, până când nu credeți că aveți dreptate 🙂 –  > Por perilbrain.
  • @caramel23 Ești pe Windows? Eu am reușit să reproduc acest lucru pe Windows cu GCC 4.7.0, dar nu și pe Ubuntu cu GCC 4.6.3. S-ar putea să fie un bug specific Windows. –  > Por Dirk Holsopple.
  • Persistența este ca o boală , m-a infectat ori de câte ori apare o problemă și voi fi atât de concentrat pe rezolvarea problemei până când voi uita că aș putea consulta pe cineva . Acum regret că mi-am pierdut timpul cu acest bug.  > Por caramel1995.
Mario

am avut aceeași problemă. încercați să citiți fișierul binar filestream:

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

m-a ajutat.

Comentarii

  • Și pe mine m-a ajutat. Cred că, dacă fișierul este UTF-8 fără a seta flag-ul binar, ifstream încarcă un „é” ca fiind un singur caracter, în timp ce el are nevoie de două. –  > Por GLCraft.
Peter

Nu este un bug al compilatorului. tellg() nu este garantat să returneze un offset de la începutul fișierului. Există un set minim de garanții, cum ar fi: dacă valoarea de returnare de la tellg() este transmisă către seekg(), pointerul de fișier se va poziționa în punctul corespunzător din fișier.

În practică, sub unix, tellg() returnează un offset de la începutul fișierului. Sub Windows, returnează un offset de la începutul fișierului, dar numai dacă fișierul este deschis în modul binar.

Dar singura garanție reală este că valorile diferite returnate de către tellg() vor corespunde unor poziții diferite în fișier.

Comentarii

  • Atunci când salvez o poziție cu tellg() și o stabilesc din nou cu seekg(), aceasta merge la o altă poziție puțin mai târziu în fișier. (win7 mingw gcc 5.3.0). –  > Por jtbr.