FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

di il
9 risposte

FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

Ciao ho un problema
ho un file "preconfezionato" ad esempio:

NOME COGNOME ETA CITTA VIA CIVICO CAP
CARLO BIANCHI 50 ROMA CAVOUR 185 58902
GIULIO ROSSSI 70 ROMA MANZONI 20 58910
ECC ECC...

Se voglio acquisire i dati tutti insieme potrei farei una strcut:


struct typedef{
char[10] nome;
char [10] cognome;
int eta;
char[10] citta;
char[10] via;
int civico;
int cap;
}dato;

APRO IL FILE
IMPOSTO IL CICLO CHE LEGGE TUTTE LE RIGHE FINO ALLA FINE DEL FILE
COPIO LA *RIGALETTA NEL VETTORE RIGA
Arrivato a questo punto, immagazzino i dati letti, nella mia struttura
il vettore dove immagazzino la riga letta dal file si chiama 'riga'

sscanf(riga,"%s %s %d %s %s %d %d",dato.nome,dato.cognome,&dato.eta,dato.citta,
dato.via,&dato.civico,&dato.cap;

In questo modo, credo che ogni parola o numero letto, vada a finire nella giusta variabile della struttura.

ma se io volessi un singolo dato tipo l' età?
Io ho pensato di contare i caratteri sino all'età e con sscanf memorizzare quel dato.
esempio
sscanf(riga[36],"%d",&dato.eta);

Questo ricordo che non funzionava oppure memorizzava un singolo dato, in questo caso solo un numero cioè azichè 50 memorizza solo il 5. non ricordo bene cmq, forse lo scasionavo con %s.
...
Cmq il mio problema è come memorizzare un singolo dato di una riga di file "preconfezionato" tipo:

NOME COGNOME ETA CITTA VIA CIVICO CAP
CARLO BIANCHI 50 ROMA CAVOUR 185 58902
GIULIO ROSSSI 70 ROMA MANZONI 20 58910

Spero di aver spiegato bene quello che cercho di fare.

9 Risposte

  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Intanto deve essere

    char nome[10];

    e non

    char[10] nome;

    ma questa penso sia una svista.

    Per quello che chiedi devi usare il puntatore

    sscanf(riga+36, ...

    ma devi essere sicuro che i dati che ti servono comincino dal punto indicato, cosa non sempre vera se i dati hanno lunghezza variabile. A questo punto è molto più comodi leggerli tutti, non vedo quale sia il problema.
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Si è stata una svista.
    mi sono accorto anche nella definizione della struct
    typedef struct{
    }dato;
    Il problema nasce perchè non faccio mai schemi o diagrammi di flusso e non sono praticissimo, è la prima volta che programmo qualcosa che ha un fine ;
    La riga è costante è preconfezionata.
    Sono dati copiati da una tabella, sono diversi ma disposti praticamente nello stesso modo.
    Quello di sopra è un esempio inventato, ed il layout è venuto diverso da come l'avevo scritto io.

    Cmq devo aggiungere un +
    sscanf(riga+36,"%d".&dato.eta);

    è diverso da?

    sscanf(riga[36],"%d".&dato.eta);
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Alexxandro ha scritto:


    La riga è costante è preconfezionata.
    Attenzione ... costante in che senso ? I campi hanno sempre la stessa lunghezza?
    sscanf(riga+36,"%d".&dato.eta);

    è diverso da?

    sscanf(riga[36],"%d".&dato.eta);
    Intanto non devi inserire il . (altra svista?) ma la ,
    quindi sarà

    sscanf(riga+36, "%d", &dato.eta);

    oppure

    sscanf(&riga[36], "%d", &dato.eta);
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Si credimi svista ...

    Cmq ho provato

    sscanf(riga+8,"%s", vettTemp); /*Questa è la vera istruzione che ho scritto nel mio programma*/

    e non s'impalla come con sscanf(riga[8]...
    con l'identificatore %s è perfetto, leggo numeri e parole...

    però mi crea un problema quando voglio trasformare una stringa numerica tipo '50' , in
    un valore intero int.
    so che devo fare l'operazione di cast..ma devo rivedere cos'è, se mi scrivi tu l'istruzione mi fai risparmiar tempo...
    Vorrei chiederti un altra cosa, anche se potrebbe sembrare una domanda stupida
    quel +8 è l'array di partenza per scansionare il vettore.
    funziona anche 1+ riga+8
    indipendentemente dal dato.
    con
    1+riga+8
    io gli dico leggi dall'array[1] all'array[8]?
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Alexxandro ha scritto:


    però mi crea un problema quando voglio trasformare una stringa numerica tipo '50' , inun valore intero int. so che devo fare l'operazione di cast..ma devo rivedere cos'è, se mi scrivi tu l'istruzione mi fai risparmiar tempo...
    No ... non devi usare il cast. Devi convertire con una funzione come

    atoi
    io gli dico leggi dall'array[1] all'array[8]?
    No ... quello è l'indirizzo di partenza del buffer da cui leggere. Quindi riga+8 indica che l'indirizzo da cui iniziare a leggere è a 8 caratteri dall'inizio. Se scrivi 1+riga+8 è come se scrivessi riga+9

    Rivedi il concetto di puntatore
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Grazie, la funzione atoi e l'unario + mi hanno aiutato a fare quello che volevo.
    Perchè mi consigli di rivedere il concetto di puntatore?.

    Credo di avere un concetto chiaro di puntatore.
    Volendolo scrivere direi che un puntatore è questo:

    int a;
    int b;
    int *puntatore;
    puntatore = &a;
    puntatore = &b;

    il puntatore è l'idirizzo/riferimento della varibile a, e dopo della variabile b
    cioè il puntatore è l'accesso a quella variabile

    Mi ci vorrebbe una ripetizione non solo dei puntatori ma anche delle stringhe e le struct. Programmando s'impara!
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Alexxandro ha scritto:


    Perchè mi consigli di rivedere il concetto di puntatore?.
    Semplicemente perché

    riga

    è un puntatore

    riga+8

    è un puntatore

    1+riga+8

    è un puntatore

    &riga[8]

    è un puntatore, ma sembra che tu non te ne sia accorto ...
    Programmando s'impara!
    No ... studiando s'impara, programmando si conferma quello che si è capito dallo studio.
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    Lo so che il nome del vettore è già un puntatore di per se al suo primo elemento. Riga[0].
    Ma &riga[8] non capisco se è un puntatore.
    Un puntatore é una variabile che come valore ha l indirizzo della cella puntata.
    Con & noi tiriamo fuori l indirizzo della variabile, ma non dovrebbe essere un puntatore.
    Sto facendo casino?
  • Re: FILE *fp ---- LETTURA DI UNA PAROLA/NUMERO

    &Riga[8] é il valore del puntatore all'elemento 8 del vettore
Devi accedere o registrarti per scrivere nel forum
9 risposte