Funzionamento tellg

di il
16 risposte

Funzionamento tellg

VI chiedo per favore un chiarimento sul comportamento della tellg

A me risulta che restituisca la posizione su cui si trova il cursore di lettura all'interno di un file

Quindi il codice seguente
int pos;
char c;

for(int i =0; i<3; i++ ){        
	pos =  f.tellg();          
	c=f.get();                  
	cout << "Letto " <<  c << " in posizione " << pos<< endl;        
}	
se eseguito su un file che contiene il testo

abc


stampa come mi aspetto

Letto a in posizione 0
Letto b in posizione 1
Letto c in posizione 2


E fin qua tutto bene.


Però mi chiedo: perchè se nel file da cui leggo invece di

abc

c'è scritto

a
b
c

ottengo:

Letto a in posizione 0
Letto
in posizione 3
Letto b in posizione 4


Il mio dubbio riguarda il fatto che la prima lettura risulta sempre dalla posizione 0 mentre la seconda sembra "saltare" alla posizione 3 pur leggendo sempre il secondo carattere (che è diventato un a capo).


Se sempre lo stesso codice lo eseguo su un file che contiene

abc
def

ottengo

Letto a in posizione 0
Letto b in posizione 2
Letto c in posizione 3


Veramente questa funzione mi sconcerta
Mi sapete spiegare cosa non ho capito del suo funzionamento per favore? Perchè la presenza di più righe nel file va a influire sul valore restituito dalla tellg nelle prime posizioni del file?

Grazie

_____________________________________

Per completezza inserisco anche il programma completo
#include <iostream>
#include <fstream>
using namespace std;


main(){
	fstream f;
	char c;
	int pos;
	
	f.open("f.txt", ios::in);
	
	if(!f){		
		cout << "errore lettura";
	}
	else{
		for(int i =0; i<3; i++ ){
			pos =  f.tellg();
			c=f.get();
			cout << "Letto " <<  c << " in posizione " << pos<< endl;

		}		
		
	}	
	f.close();	

}

16 Risposte

  • Re: Funzionamento tellg

    La tellg() fa il suo lavoro, ma il carattere restituito dalla get() non è stampabile (essendo un '\n' manda a capo il cursore).
    In pratica è utile solo per file binari (come la ftell() del C)
  • Re: Funzionamento tellg

    Ciao shodan intanto grazie della risposta
    Però temo tu non abbia capito cosa intendevo
    Il problema non è il carattere \n (che viene ovviamente stampato come un a capo)

    Il problema è la numerazione sbagliata della tellg
    Ossia se nel file da cui leggo c'è scritto

    abc
    def

    dovrei ottenere la stampa

    Letto a in posizione 0
    Letto b in posizione 1
    Letto c in posizione 2

    invece ottengo

    Letto a in posizione 0
    Letto b in posizione 5
    Letto c in posizione 6


    IL problema non si presenta invece se nel file il testo è scritto tutto su una riga.

    abcdef

    Spero di essere stata più chiara ora
  • Re: Funzionamento tellg

    Prova ad aprire il file di input con un editor esadecimale, potrebbero esserci dri caratteri non stampabili. Potresti un prima analisi controllare la dimensione del file e cercare di capire se non ci sono dei caratteri inattesi...
  • Re: Funzionamento tellg

    candaluar ha scritto:


    Prova ad aprire il file di input con un editor esadecimale, potrebbero esserci dri caratteri non stampabili. Potresti un prima analisi controllare la dimensione del file e cercare di capire se non ci sono dei caratteri inattesi...

    Non è un problema di un file particolare
    Posso ricreare la situazione inserendo un qualsiasi testo:
    - Se il testo nel file è tutto su una riga la tellg funziona correttamente
    - Se il testo nel file è su più righe la tellg va a campi sul secondo carattere
  • Re: Funzionamento tellg

    Quale compilatore usi? Io ho usato il tuo codice con un file appena creato con notepad e ho ottenuto

    Letto a in posizione 0
    Letto b in posizione 1
    Letto c in posizione 2
  • Re: Funzionamento tellg

    Non è un problema di un file particolare
    Prendi uno qualsiasi dei file con cui ottieni comportamenti strani e verificalo con un editor esadecimale.
  • Re: Funzionamento tellg

    oregon ha scritto:


    Quale compilatore usi? Io ho usato il tuo codice con un file appena creato con notepad e ho ottenuto

    Letto a in posizione 0
    Letto b in posizione 1
    Letto c in posizione 2

    Con quale testo nel file hai ottenuto questo output?
    Uso dev-c++
  • Re: Funzionamento tellg

    candaluar ha scritto:


    Non è un problema di un file particolare
    Prendi uno qualsiasi dei file con cui ottieni comportamenti strani e verificalo con un editor esadecimale.
    Ripeto:
    - se lancio il programma sul file che contiene

    abcdefg

    ottengo l'ouput corretto

    - Se modifico LO STESSO FILE file inserendo SOLO UN A CAPO dopo la lettera c

    abc
    def

    la tellg non funziona più

    Tra il primo e il secondo carattere non è cambiato nulla!!! E comunque ho inserito ESCLUSIVAMENTE un a capo
  • Re: Funzionamento tellg

    ... e non hai risposto alla mia domanda ...
  • Re: Funzionamento tellg

    Potresti caricare il file di testo così lo controlliamo? Ho provato il tuo codice, in windows con Visual Studio e ho visto che funziona correttamente.
  • Re: Funzionamento tellg

    sandrag ha scritto:


    oregon ha scritto:


    Quale compilatore usi? Io ho usato il tuo codice con un file appena creato con notepad e ho ottenuto

    Letto a in posizione 0
    Letto b in posizione 1
    Letto c in posizione 2

    Con quale testo nel file hai ottenuto questo output?
    Uso dev-c++
    abc
    def
  • Re: Funzionamento tellg

    Guarda ... se stai usando DevC++ e il suo compilatore con relative librerie (mingw) allora sappi che ha questi problemi. Mi sembra che la soluzione fosse aprire il file con

    ios::in | ios::binary

    ma ovviamente ti consiglio vivamente di NON usarlo affatto.
  • Re: Funzionamento tellg

    In questo caso il problema non è DEV-C++ (da non usare a prescindere) ma proprio la diversa implementazione degli stream (più precisamente di std::filebuf) tra VC++ e GCC.
    L'errore però è usare tellg() su file aperti in modalità testo, dato che il valore restituito ha significato solo per file aperti in modalità binaria.
    https://stackoverflow.com/questions/22984956/tellg-function-give-wrong-size-of-file/22986486#22986486
  • Re: Funzionamento tellg

    shodan ha scritto:


    In questo caso il problema non è DEV-C++ (da non usare a prescindere) ma proprio la diversa implementazione degli stream (più precisamente di std::filebuf) tra VC++ e GCC.
    L'errore però è usare tellg() su file aperti in modalità testo, dato che il valore restituito ha significato solo per file aperti in modalità binaria.
    https://stackoverflow.com/questions/22984956/tellg-function-give-wrong-size-of-file/22986486#22986486

    SI lo so che dev-c++ ha problemi ma lo usiamo in ambito scolastico: mi sapete suggerire un prodotto free migliore? STavo guardando Code-block...

    Mi era sfuggito invece che la tellg fosse per i file aperti in modalità binaria: eviterò di usarla in questo modo.

    Grazie mille a tutti delle risposte e della pazienza
Devi accedere o registrarti per scrivere nel forum
16 risposte