[C++] Problema lettura file ad accesso diretto.

di il
19 risposte

[C++] Problema lettura file ad accesso diretto.

Ciao a tutti.
Sto scrivendo un programma dove devo leggere una specifica riga di un file (formattato) .
Ogni riga del file è così formattata: int_string_int .
Per accedere al file utilizzo un accesso diretto utilizzando il primo int del file come indice di riga.
Una volta letta la riga devo prendere i vari "campi" che la compongono e inserirli in delle variabili private di una classe. Il mio problema è proprio quest'ultimo. Vi posto il codice sperando di riuscire a farmi capire un po' meglio.
 
 class  Giocatore
  {
      /*Questa è la classe di in cui sono presenti le variabili che devo settare con i 
         valori dei vari "campi" presenti nelle righe del file */
       private:
                    int account;
                    string nome;
                    int punteggio;
      public: 
                  void setAccount(int);
                  void setNome(string);
                  void setPunt(int);

  };

//////////FileManaging.h/////////////
//Questa è la classe che utilizzo per elaborare il file
class FileManaging
{
    private:
                ifstream inFile;
                Giocatore player;
    public:
                  
             Giocatore readFile(int locazione )  /*locazione è l'indice di riga (account) che fornisco alla  
 funzione per andare a leggere tale riga*/                
};
 /////////////FileManaging.cpp////////////

Giocatore FileManaging::readFile(int location)
{
          inFile.seekg(location * sizeof(Giocatore));
          inFile.read(reinterpret_cast< char * >(&player), sizeof(Giocatore));
          return player;
  
}

  Questo è un esempio della formattazione del file che devo leggere

1 Pippo 10
2 Topolino 34
3 Ciccio 6
4 pino 6
ecc...
Premetto che ho volutamente tralasciato altre funzioni e variabili, tipo per l'apertura del file, volutamente, giusto per non inserire parti di codice che non interessano al caso in questione.

Allora, con la funzione seekg mi porto alla riga voluta (giusto?) e poi con read leggo la riga corrispondente a location. Quindi nella variabile player (di tipo giocatore), dovrebbe esserci memorizzata la riga(?). Il mio problema è che non so come "spezzettare" i vari campi della riga di player che tramite le funzioni setAccount ecc (definite nella classe Giocatore) dovrò andare ad inserire nelle variabli account, nome, punteggio della classe Giocatore. Molto probabilmente il codice che ho scritto e mezzo sbagliato . Potreste darmi una mano?

19 Risposte

  • Re: [C++] Problema lettura file ad accesso diretto.

    Ma il file e' in ascii o in binario?
    se e' in ascii, non funziona
    la stringa ha una lunghezza predefinita o e' variabile?
    se e' variabile, non funziona
    come e' definita Carte?
    in Carte, come e' definita la stringa?
    se la stringa e' definita come char*, non funziona
  • Re: [C++] Problema lettura file ad accesso diretto.

    Il file è in binario. Ho sbagliato a scrivere il codice, in realtà carte è la classe giocatore, ho corretto il codice. Non conosco la lunghezza della riga, ma solo la formattazione (int strong int). Grazie mille per l'interessamento
  • Re: [C++] Problema lettura file ad accesso diretto.

    x86 ha scritto:


    il file è in binario. Ho sbagliato a scrivere il codice, in realtà carte è la classe giocatore, ho corretto il codice. Non conosco la lunghezza della riga, ma solo la formattazione (int strong int). Grazie mille per l'interessamento
    Allora NON FUNZIONA!

    Ci sono diverse ROGNE:

    1) usi l'oggetto STL string, come stringa. Ma tale ogetto non e' un oggetto primitivo del C++, ma una struttura dati generata a partire da un template. Insomma un oggetto bello complesso contenente puntatori, contatori, reference counting, ecc..

    2) NON USI gli operatori di lettura da file delle STL, quindi non puoi sfruttare i meccanismi di deserializzazione delle STL. Cosi' come hai scritto il codice, riempiresti la struttura dati usta per la stringa STL con dei valori che non hanno senso (sequenze arbitrarie di byte interpretate come puntatori in memoria di buffer ---> disastro assicurato al 10.000% )

    3) il tuo file e' stato scritto usando i meccanismi di serializzazione delle STL? Se si, si puo' fare qualcosa, se no, NON FUNZIONA

    Ti serve sapere MOLTO DI PIU' su come e' strutturato il file:

    1) quanti byte sono stati utilizzati per rappresentare i due interi (sempre lo stesso o sono interi di lunghezza diversa?)
    2) ti serve sapere ESATTAMENTE come e' memorizzata la stringa
  • Re: [C++] Problema lettura file ad accesso diretto.

    Il file è un .txt del bloc note.

    Da quanto ci é stato spiegato a lezione con l'accesso binario gli interi vengono letti su 32 bit, anziché 8 bit per cifra come avviene nei file sequenziali
  • Re: [C++] Problema lettura file ad accesso diretto.

    x86 ha scritto:


    Da quanto ci é stato spiegato a lezione con l'accesso binario gli interi vengono letti su 32 bit, anziché 8 bit per cifra come avviene nei file sequenziali
    Questa affremazione non ha senso:

    1) una cosa e' un file binario, una cosa e' un file ASCII (quello scritto con Notepad, per intenderci)

    2) una cosa e' un file ad accesso sequenziale ed una un file ad accesso diretto. Concetti che non hanno niente a che vedere con quelli del punto 1)

    3) in binario sei tu che indichi al programma con quanti bit leggere l'intero. Concetto che non ha nulla a che fare con i punti 1) e 2)

    Quindi:

    il tuo file NON E' BINARIO, ma ASCII (e' stato scritto con Notepad o programma equivalente) e NON PUO' ESSERE LETTO mediante un accesso DIRETTO, ma solo mediante un accesso SEQUENZIALE per il banale motivo che ogni riga (i caratteri compresi tra l'inizio del file ed il primo a capo, o tra un a capo e l'altro) contiene un numero di caratteri potenzialmente diverso da riga a riga (non vuol dire nulla se per una strana coincidenza due o piu' righe, al momento, risultano avere esattamente lo stesso numero di caratteri)
  • Re: [C++] Problema lettura file ad accesso diretto.

    Grazie, mi hai schiarito molto le idee ed evitato di perdere tempo su un approccio non idoneo al mio problema. Scusa per le castronerie che ho scritto
  • Re: [C++] Problema lettura file ad accesso diretto.

    Se il file è ASCII:
    Leggi l'intera riga;
    Scomponila in tre stringhe;
    Trasforma la prima e la terza in numero;

    Per leggerla:
    Basta che la leggi intera

    Per scomporla:
    Stampa un carattere alla volta sulla prima sottostringa finché non incontri lo spazio. Fallo per la successiva. Per la terza una il newline '\n' o il terminatore '\0', a seconda di come hai letto.

    Per trasformarla:
    atoi()
  • Re: [C++] Problema lettura file ad accesso diretto.

    Quindi l'accesso diretto puó essere usato solo per un file binario?
  • Re: [C++] Problema lettura file ad accesso diretto.

    Puoi anche su un file ASCII, ma non sapresti dove posizionarti
  • Re: [C++] Problema lettura file ad accesso diretto.

    x86 ha scritto:


    Quindi l'accesso diretto puó essere usato solo per un file binario?
    Su qualunque file in cui la lunghezza del record (che potrebbe anche essere una riga) e' sempre lo stesso.

    Ci possono essere semplici varianti, ma al momento non sono importanti.
  • Re: [C++] Problema lettura file ad accesso diretto.

    Quindi nel mio caso, pur avendo creato una Classe di tipo giocatore che corrisponde una generica riga del file, non é fattibile in quanto le righe non hanno tutte la stessa lunghezza?
  • Re: [C++] Problema lettura file ad accesso diretto.

    Per cercare la riga leggi caratteri finché non hai letto tot '\n'. ( se devi andare alla riga 10 leggi caratteri senza salvarli finché non hai letto 9 '\n' )

    Per leggere guarda il mio primo messaggio


    PS importantissimo : con stringa intendo vettore di caratteri, non std::string
  • Re: [C++] Problema lettura file ad accesso diretto.

    Allora, la mia idea è di leggere tante righe fino ad arrivare alla riga desiderata utilizzando lo '\n' come ha detto ale99.

    Ho provato a tirare giù del codice
    
    //////////FileManaging.h///////////////
    Questa è la classe che utilizzo per elaborare il file
    class FileManaging
    {
        private:
                    ifstream inFile;
                    int accoutNumber;
                    string nome;
                    int pont;
                   
        public:
    
                  int testEof();    
                 void readFile(int locazione )             
    };
    
    ////////////FileManaging.cpp///////////////
    #include <istream>
    #include <fstream>
    
    int FileManaging::testEof()
    {
        return inFile.eof();
    }
    
    void FileManaging::readFile(locazione)
    {
          int occorrenze_newline=0;
          char carattere;
        
         while(!testEof() && occorrenze_newline != locazione-1)
        {
                    carattere = inFile.get();
                    if( carattere == '\n') occorrenze_newline++;
    
         }
    
         readFile >> accountNumber >> nome >> point;
        readFile.seekg(0);
    }
    
    
    
    


    Potrebbe andare? (io credo di no )
  • Re: [C++] Problema lettura file ad accesso diretto.

    Provalo..
Devi accedere o registrarti per scrivere nel forum
19 risposte