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

    [c++] Una volta caricato velocissimamente il file in memoria come gestirlo?

    Leggendo il tutorial cplusplus sono riuscito a caricare in un secondo...
    4000 righe del file estrazioni in memoria

    codice:
    
    // reading a complete binary file
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    ifstream::pos_type size;
    char * memblock;
    
    int main () {
      ifstream file ("ESTRAZIONI.txt", ios::in|ios::binary|ios::ate);
      if (file.is_open())
      {
        size = file.tellg();
        memblock = new char [size];
        file.seekg (0, ios::beg);
        file.read (memblock, size);
        file.close();
    
        cout << "the complete file content is in memory";
    
        delete[] memblock;
      }
      else cout << "Unable to open file";
      cin.get();
      //return 0;
    }
    Alla fine il tutorial dice:

    At this point we could operate with the data obtained from the file. Our program simply announces that the content of the file is in memory and then terminates.

    La domanda è a questo punto:

    Come posso gestire il contenuto caricato in memoria?

    Grazie agli esperti/e

    Ps:Finora lavorando con i vector sono riuscito a fare pian piano tutte le operazioni volute ma le vorrei riuscire a fare altrettanto lavorando con la memoria molto più rapida credo...
    a giudicare dal tempo di caricamento dei dati nella stessa...

    In sostanza dovrei...

    caricare in memoria due file di molte righe...
    e confrontare queste righe (costituite da numeri intervalliti da virgola) le une con le altre rilevandone eventuali occorrenze doppie o meno...

    es.

    file1

    1,2,3,4,5

    file2

    2,10

    file1 vs file2 -> il valore 2 è presente in entrambe le rispettive righe dei due files

    Mi basterebbe comunque solo qualche esempio di accesso ai dati caricati in memoria e di gestione degli stessi


  2. #2
    La lettura completa del file ti converrebbe se dovessi anche salvare il file dopo averlo modificato.
    Se devi solamente confrontare 2 files senza poi modificarli e salvarli, conviene leggere i due files linea per linea.
    Se leggi i due files completamente ovviamente rischi l'out-of-memory se magari i due files fossero di grandi dimensioni anche se una volta in memoria avresti più efficienza nelle operazioni.

    Prova a leggere i files linea per linea con la funzione
    istream& getline ( istream& is, string& str );

    Poi per spezzare la linea ogni "," usa la funzione C strtok(char* str, char* tok)

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

    In quel modo già provato ma è molto lento...

    Originariamente inviato da lolide
    La lettura completa del file ti converrebbe se dovessi anche salvare il file dopo averlo modificato.
    Se devi solamente confrontare 2 files senza poi modificarli e salvarli, conviene leggere i due files linea per linea.
    Se leggi i due files completamente ovviamente rischi l'out-of-memory se magari i due files fossero di grandi dimensioni anche se una volta in memoria avresti più efficienza nelle operazioni.

    Prova a leggere i files linea per linea con la funzione
    istream& getline ( istream& is, string& str );

    Poi per spezzare la linea ogni "," usa la funzione C strtok(char* str, char* tok)
    Non c'e' un modo per riprendere... e gestire il dato immagazzinato molto velocemente in memoria?

    es...

    un'operazione analoga a quanto succede nei vector... di lettura... del container...

    Come faccio a leggere il contenuto in memoria?

    Grazie 1000


  4. #4
    allora, se leggi il file tutto insieme poi hai un'array di char che contiene il tuo file, recuperi le linee usando strtok(array, "\r\n") e poi esegui le varie operazioni.

    Leggendo con getline lasci fare quelle operazioni alla funzione ma alla fine fai le stesse cose.

    Quindi un modo più veloce non c'è.... la più comoda sicuramente è usando getline()

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

    Mi spiegheresti passo passo... ?

    Originariamente inviato da lolide
    allora, se leggi il file tutto insieme poi hai un'array di char che contiene il tuo file, recuperi le linee usando strtok(array, "\r\n") e poi esegui le varie operazioni.

    Leggendo con getline lasci fare quelle operazioni alla funzione ma alla fine fai le stesse cose.

    Quindi un modo più veloce non c'è.... la più comoda sicuramente è usando getline()
    1) Con "se leggi il file tutto insieme" intendi di metterlo in memoria?
    2) L'array di char lo costruisco prelevando i dati dalla memoria?
    Se si... come?

    Se si ... sono d'accordo con te che potrebbe essere il modo + rapido possibile... mentre se no... ti chiedo a che serve allora mettere i dati in memoria??? Se poi non si possono gestire?

    Grazie ancora a te e a tutti/e quelli/e che vorranno intervenire costruttivamente...


  6. #6

    Re: Mi spiegheresti passo passo... ?

    Originariamente inviato da freetom
    1) Con "se leggi il file tutto insieme" intendi di metterlo in memoria?
    2) L'array di char lo costruisco prelevando i dati dalla memoria?
    Se si... come?
    con questo codice:
    codice:
    ifstream file ("ESTRAZIONI.txt", ios::in|ios::binary|ios::ate);
      if (file.is_open())
      {
        size = file.tellg();
        memblock = new char [size];
        file.seekg (0, ios::beg);
        file.read (memblock, size);
        file.close();
    }
    tu metti in memblock tutto il file
    memblock è un array di char, e su questo devi fare le operazioni.

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

    Re: Re: Mi spiegheresti passo passo... ?

    Originariamente inviato da lolide
    con questo codice:
    codice:
    ifstream file ("ESTRAZIONI.txt", ios::in|ios::binary|ios::ate);
      if (file.is_open())
      {
        size = file.tellg();
        memblock = new char [size];
        file.seekg (0, ios::beg);
        file.read (memblock, size);
        file.close();
    }
    tu metti in memblock tutto il file
    memblock è un array di char, e su questo devi fare le operazioni.

    "memblock è un array di char, e su questo devi fare le operazioni"

    Mi faresti un esempio? Per accedere analogamente ad un vector a memblock?

    Grazie infinite


  8. #8

    Re: Re: Re: Mi spiegheresti passo passo... ?

    Originariamente inviato da freetom
    "memblock è un array di char, e su questo devi fare le operazioni"

    Mi faresti un esempio? Per accedere analogamente ad un vector a memblock?

    Grazie infinite

    http://www.math.unipd.it/~sperduti/C...0caratteri.htm

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

    Re: Re: Re: Re: Mi spiegheresti passo passo... ?

    Originariamente inviato da lolide
    http://www.math.unipd.it/~sperduti/C...0caratteri.htm
    piano piano forse...

    con questo sono riuscito a rileggere le prime tre quartine memorizzate in un lampo in memblock!

    codice:
    cout << "\n\n";
        cout << "prova lettura memblock";
        cout << "\n\n";
        cout << memblock[0];
        cout << memblock[2];
        cout << memblock[4];
        cout << memblock[6];
        cout << "\n";
        cout << memblock[9];
        cout << memblock[11];
        cout << memblock[13];
        cout << memblock[15];
        cout << "\n";
        cout << memblock[18];
        cout << memblock[20];
        cout << memblock[22];
        cout << memblock[24]; 
        cin.get();
    però il problema adesso è automatizzare la visualizzazione di tutte le quartine adottando un for appropriato... Ad esempio qui noterei tra una quartina e l'altra lo stacco di 3 posizioni di indice... ma come potrei passare questo input al for che ho in mente?

    O in alternativa per semplificare come potrei far corrispondere ad ogni elemento di quartina un indice pari invece di avere il salto 4 indici pari 4 dispari 4 pari ecc... ?

    Grazie comunque!


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

    piccolo aggiornamento...

    Con questa piccola modifica sono riuscito a visualizzare tutto il contenuto di memblock...

    codice:
    for (int i=0; i< 17886337; i++)  {
        
        
        cout << memblock[i];
      
        
        }
        
        cin.get();
    solo che questo contenuto... include le virgole e i ritorni a capo che vorrei escludere per avere i soli numeri da confrontare...

    il contenuto visualizzato è del tipo:

    1,2,3,4
    1,2,3,5
    1,2,3,6
    ecc...

    ma appunto include sia le virgole che i ritorni a capo (non visibili...)

    come potrei "estrapolare" in 4 variabili temporanee solo i valori numerici di ciascuna quartina memorizzata in memblock?

    Grazie a tutti/e coloro che mi risponderanno


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 © 2024 vBulletin Solutions, Inc. All rights reserved.