Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    [c++] modo pratico per rilevare e visualizzare sempre le ultime tot righe di un file

    Per adesso ho risolto in parte empiricamente con questo:

    codice:
    if (testo.is_open())
    {cout << "Prime 15 righe:\n\n";
    for (int i=0;i<15;i++)
    {
    getline (testo,line);
    cout << line << endl;
    }
    cout << "\n\nUltime 15 Righe:\n\n";
    
    //cosi' facendo sono arrivato empiricamente... a prelevare le tot riga... partendo dal fondo...
    testo.seekg (((340)*(-1)), ios::end);
    Ma vorrei sapere dagli esperti se è possibile adottare un altro modo per rilevare sempre, senza bisogno di fare aggiustamenti empirici al valore ritrovato (es. 340), le ultime tot righe (in questo caso 15) di un file txt.

    Thanks


  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Te l'ho già detto in altri thread simili che hai aperto in precedenza ...

    A partire dalla fine del file, tornando indietro di un carattere alla volta, devi contare i caratteri di "fine linea" in modo da ottenere il puntatore all'inizio della linea che ti serve.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Ok ma...

    1) coma faccio ad andare alla fine del file?

    2) non basta un for con decremento di uno applicato al getline tipo:

    codice:
    cout << "ultime 15 righe";
    
    for (int i=finedelfile;i<15;i--)
    {
    getline (testo,line);
    cout << line << endl;
    }
    una volta che ho il valore di finedelfile richiesto al punto1?

    Voglio dire non dovrebbe essere del tutto analogo al funzionante:

    codice:
    cout << "prime 15 righe:";
    
    for (int i=0;i<15;i++)
    {
    getline (testo,line);
    cout << line << endl;
    }


    ps:Riguardo il sistema che hai detto tu ho capito la logica ma non saprei come fare...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    1) metodo seekg ... http://www.cplusplus.com/reference/i...istream/seekg/

    2) la getline legge in "avanti" non "indietro" nel file ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    grazie oregon ma è + difficile di quanto pensassi...

    Originariamente inviato da oregon
    1) metodo seekg ... http://www.cplusplus.com/reference/i...istream/seekg/

    2) la getline legge in "avanti" non "indietro" nel file ...

    (1) provato e riprovato ma seekg mi risulta assai duro da digerire...
    (2) sembra non esservi altre alternative... dunque
    (3) cercato e ricercato anche sul web se vi fossero spiegazioni su questa necessità di prelevare parte finale di un file txt e nulla...

    Grazie se mi puoi dare qualche esempio illuminante sul suo utilizzo al fine di poterlo adattare al mio semplice contesto.


  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481

    Re: grazie oregon ma è + difficile di quanto pensassi...

    Originariamente inviato da freetom
    provato e riprovato ...
    Beh, in via eccezionale (non mi piace scrivere e postare codice pronto ...) ... questo è un esempio (da adattare ...) ...

    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    #define LINEE 15
    
    int main()
    {
    	ifstream f;
    	f.open("tuofile.txt", ios::binary);
    
    	int ri=0;
    	f.seekg(-1, ios::end);
    	char c;
    	f.get(c);
    	while(ri<LINEE)
    	{
    		if(c=='\n') ri++;
    		f.seekg(-2, ios::cur);
    		if(f.fail()) 
    		{
    			f.clear();
    			f.seekg(0, ios::beg);
    			break;
    		}
    		f.get(c);
    	}
    
    	string line;
    	getline(f, line);
    	getline(f, line);
    	while(!f.fail())
    	{
    		cout << line << endl;
    		getline(f, line);
    	}
    
    	f.close();
    
    	return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Ti ringrazio infinitamente oregon!

    Lo studierò e adatterò al mio caso!

    Ancora grazie!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.