Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] lettura/scrittura su file: metodi consigliati

    Salve a tutti,
    ho visto che c'era un'altro trhead aperto, ma era abbastanza diverso dal mio e non volevo creare confusione.

    Dunque ho una struttura che descrive ad esempio i dipentendi di un azienda, con campi del tipo "Nome", "cognome", "età". Devo scriverli su un file, e fin qui "li potresti scrivere con la funzione che più ti piace". Il punto è poi nella rilettura.

    Ovvero poi devo poter leggere i vari campi e riconoscerli, ovviamente tramite dei confronti.

    A questo punto mi chiedevo, invece di creare il classico file.txt:

    codice:
    Nome: Pippo
    Cognome: Paperino
    età: 13
    
    Nome: Pluto
    Cognome: Disney
    età: 56
    In cui poi dovrei ricercare parola per parola e dire, mediante una string compare "è uguale a nome?" e via discorrendo. Non sarebbe piu utile adottare una funzione di tipo xml?

    Ovvero, se facessi un file del tipo:

    codice:
    <dipendente>
    <nome>
    pippo
    </nome>
    <cognome>
    paperino
    </cognome>
    <età>
    13
    </età>
    </dipendente>
    A questo punto potrei fare sempre un confronto, con i campi, però ad esempio se uno avesse due nomi potrei far si che vengano messi di fila e che legga da "<nome>" a "</nome>", come anche se mi chiedono quandi dipendenti ho posso leggere al volo quante volte si ripete la stringa <dipendente> nel file.

    Voi che dite? potrebbe essere una soluzione migliore o solo una perdita di tempo?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Secondo me implementare un parser XML corretto è un mestiere complicato e, almeno in questo caso, inutile. Il metodo più semplice per gestire dei record di quel genere, a mio avviso, è l'impiego di file CSV o analoghi: sono facili da scrivere e da leggere con fprintf/fscanf, hai una "sintassi del file" ridotta all'osso, puoi contare rapidamente il numero di record contando i ritorni a capo, non hai particolari problemi di caratteri riservati nei record (devi solo evitare che nei record si usino le virgole).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Secondo me implementare un parser XML corretto è un mestiere complicato e, almeno in questo caso, inutile. Il metodo più semplice per gestire dei record di quel genere, a mio avviso, è l'impiego di file CSV o analoghi: sono facili da scrivere e da leggere con fprintf/fscanf, hai una "sintassi del file" ridotta all'osso, puoi contare rapidamente il numero di record contando i ritorni a capo, non hai particolari problemi di caratteri riservati nei record (devi solo evitare che nei record si usino le virgole).
    Cioè intendi qualcosa del tipo:

    "Nome","Cognome","età","Nome".... eccetera?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4
    oppure puoi concatenarli in una stringa binaria ad esempio:

    lunghezza riga (4 bytes) , lunghezza primo campo(2 bytes), primo campo (char *), lunghezza secondo campo(2 bytes), secondo campo (char *)...etc...puoi anche aggiungere un ulteriore byte prima del campo per indicare che tipo è: 0x00 = nome, 0x01 = cognome ...etc...

    ora sta a te decidere se ogni campo/riga deve avere una lunghezza prefissata o variabile a seconda del contenuto.
    Alla batteria dai retta ballA

  5. #5
    Più o meno; la prima riga può essere impiegata come header, ma non è strettamente necessario; ogni riga successiva poi rappresenterebbe un record.
    codice:
    Nome, Cognome, Età
    Mario, Rossi, 25
    Matteo, Artusi, 19
    Pinco, Pallino, 63
    Padre, Pio, 90
    La prima riga verrebbe letta con una fscanf e i risultati verrebbero confrontati con i valori attesi per gli header attesi. In caso di header non corrispondente, il file verrebbe rigettato. Quindi bisogna leggere tutti gli i record, sempre con la fscanf.
    codice:
    char nome[250], cognome[250], buffer[20];
    int eta;
    if(fscanf(FileInput, "%250s, %250s, %20s", nome, cognome, buffer)!=3)
    {
        /* file non valido */
    }
    if(stricmp(Nome, "Nome") || stricmp(Cognome, "Cognome") || stricmp(Buffer, "Età"))
    {
        /* file non valido */
    }
    while(!feof(FileInput))
    {
        if(fscanf(FileInput, "%250s, %250s, %d", nome, cognome, &eta)!=3)
        {
            /* errore di lettura */
        }
        /* qui hai il record caricato correttamente in nome, cognome e eta */
    }
    Per il resto la scrittura è una banalità.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.