Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    Lettura da file di testo c++

    Il problema è il seguente:
    da un file *.dxf devo leggere e memorizzare le coordinate di una polilinea.
    Aprendo il file con un editor di testo, la sezione del file in cui sono presenti le righe con le coordinate appare così


    ....(righe precedenti)
    10
    valore di x1
    20
    valore di y1
    10
    valore di x2
    20
    valore di y2
    ...(righe successive)

    dove i codici 10 e 20 indicano che alla riga successiva si trova il valore rispettivamente x e y del punto i-esimo.

    Pensavo di operare nel modo seguente:
    1. arrivo a leggere fino alla riga prima della serie di quattro righe con le coordinate del primo punto (fino qui a posto);
    2. leggo quattro righe (questo è il problema);
    3. confronto la prima e la terza riga per capire se contengono i codici che indicano le coordinate dei punti: se vero, memorizzo le righe 2 e 4 come coordinate, se falso, sono finite le coordinate di quella polilinea (non dovrei avere grossi problemi).


    La nota dolente è il punto 2: per leggere il file uso
    codice:
    while(f.good())
    {
        getline(f,s);
    }
    ma così leggo riga per riga.
    Una volta arrivato alla sezione con le coordinate vorrei leggere a gruppi di quattro righe, mi sarebbe più comodo, è possibile?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    intuitivamente direi che leggere a gruppi di 4 significa leggere riga per riga... 4 volte!
    Se ti viene più comodo puoi fare un ciclo for con i=0; i<4 e leggere una riga alla volta. Alla fine del ciclo for ne avrai lette 4. Per quanto riguarda la memorizzazione, puoi utilizzare un std::vector<std::string> sul quale poi farai le elaborazioni che ti servono.

  3. #3
    le soluzioni sono molteplici
    1 leggere tutto il file e caricarlo in vettore di stringhe e quindi lavorare sul vettore, molto più veloce e pratico rispetto ad un accesso random al file.
    2 leggere 8 righe dal file e copiarle in un vettore da 8 stringhe, effettuare i controlli, nel caso positivo trattare i dati e leggere le successive 8 righe dal file, in caso negativo effettuare uno shift nel vettore di stringhe e memorizzare la riga successiva dal file e ripetere il controllo (un poco più complicato, ma abbastanza funzionale)
    Ultima modifica di Samuele_70; 15-12-2014 a 19:42
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Ciao,
    intuitivamente direi che leggere a gruppi di 4 significa leggere riga per riga... 4 volte!
    Se ti viene più comodo puoi fare un ciclo for con i=0; i<4 e leggere una riga alla volta. Alla fine del ciclo for ne avrai lette 4. Per quanto riguarda la memorizzazione, puoi utilizzare un std::vector<std::string> sul quale poi farai le elaborazioni che ti servono.
    Ma il ciclo for va messo all'interno del while?

    con qualche riga di codice forse riesco a capire:

    codice:
    while(f.good())
    {
    getline(f,s);
    //condizioni per verificare di essere arrivati al blocco di righe delle coordinate
    //se siamo al punto giusto
    for(i=0;i<=4;i++)
    {getline(f,s1[i]);//s1 è stato dichiarato come vector di 4 elementi
    }
    //parte che serve a memorizzare le coordinate
    }
    Si può fare così?
    Quindi quando metto il comando getline(f,s), la volta successiva che richiamo il comando getline passa in automatico alla linea successiva?

    Grazie

  5. #5
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da Samuele_70 Visualizza il messaggio
    le soluzioni sono molteplici
    1 leggere tutto il file e caricarlo in vettore di stringhe e quindi lavorare sul vettore, molto più veloce e pratico rispetto ad un accesso random al file.
    2 leggere 8 righe dal file e copiarle in un vettore da 8 stringhe, effettuare i controlli, nel caso positivo trattare i dati e leggere le successive 8 righe dal file, in caso negativo effettuare uno shift nel vettore di stringhe e memorizzare la riga successiva dal file e ripetere il controllo (un poco più complicato, ma abbastanza funzionale)
    Mi pare interessante l'opzione 1, ma da bravo ignorante (non programmo per professione ma per necessità...) non rischio di usare un sacco di memoria? O molto probabilmente la quantità di memoria usata sarà pari pari alla dimensione del file dxf (che se occupa qualche Mb è già tanto)?
    Grazie

  6. #6
    L'opzione 1 è quella che di solito preferisco anche io.
    Si, la quantità di memoria utilizzata è proporzionale alla dimensione del file.
    Il problema della quantità di RAM è ormai un retaggio del passato, sui moderni pc si trova una quantità di memoria RAM negli ordini dei giga, pertanto qualche MB non rappresentano certo un problema per all'allocazione dinamica
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quote Originariamente inviata da ing82 Visualizza il messaggio
    Ma il ciclo for va messo all'interno del while?

    con qualche riga di codice forse riesco a capire:

    ...

    Si può fare così?
    Sì, ad occhio direi di sì. Attenzione al for: avevo detto i<4, non <=4. Se metti <=4 il codice viene eseguito 5 volte!

    Quote Originariamente inviata da ing82 Visualizza il messaggio
    Quindi quando metto il comando getline(f,s), la volta successiva che richiamo il comando getline passa in automatico alla linea successiva?
    Esatto.

  8. #8
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Ok grazie a tutti delle risposte.

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.