Newsgroup: it.comp.lang.c++
Titolo: fscanf e inserimento in una struct

...ok...mi rendo conto che è una domanda di livello bassissimo...ma qui il
tempo stringe, e tra 3 giorni devo consegnare sto benedetto progetto, e mi
sono decisamente arenato.
typedef struct x {
    char *nome;
    char *cognome;
    struct y *as;
    float stipendio;
    struct x *next;
   } PERSONE;
        struct y {
   int giorni;
   int mesi;
   int anni;
   struct y *next;
  };
Ho una struct in cui devo inserire una serie di informazioni contenute in un
file, ognuna di queste info si trova su una riga diversa, le info sono 6,
quindi io facendo un ciclo di questo tipo...
while (!feof(fAzienda))
    {
     fscanf(fAzienda, "%s%s%d%d%d%f", nome, cognome, &a, &m, &g, &s); //
dove nome cognome ecc sono variabili che ho creato
     lista = malloc(sizeof(PERSONE));
     lista->nome = malloc ((strlen(nome))*sizeof(char));
     lista->nome = nome;
     lista->cognome = malloc ((strlen(cognome))*sizeof(char));
     lista->cognome = cognome;
     as->giorni=g;
     as->mesi=m;
     as->anni=a;
     lista->stipendio=s;
}
....inserisco ogni record al suo posto...e il gioco dovrebbe essere fatto.
Purtroppo nel file che la prof ci ha gentilmente fornito ci sono nomi tipo
"Maria Chiara" o cognomi come "De Rossi", ed ecco che la doppia stringa
distrugge la logica del mio ciclo e mi incasina tutto.
Io vorrei sapere da voi se magari esiste un'indicatore di fine riga, un
qualcosa con cui posso forzare C a prendere ogni riga e inserirla nella mia
struct, oppure non so...sono anche pronto a buttare nel cesso tutto se
qualcuno mi instrada vero la giusta via....per il momento non vedo altre
soluzioni che attaccare i nomi quindi....se qualcuno mi vuole aiutare...
grazie 1000 cmq
kim

 ...ok...mi rendo conto che ?una domanda di livello bassissimo...ma qui il


Una possibile soluzione è leggere tutta la riga con la funzione fgets. La
sintassi è:
fgets (char *s, int n, FILE *f)
dove s è la stringa dove porre i dati letti, n è il numero massimo di
caratteri da leggere (la lettura si ferma se incontra un EOL oppure
raggiunge il numero massimo di caratteri, dipende cosa si verifica prima) e
f è il file da cui leggere. C'è il problema però di distinguere tra nome e
cognome, come ad esempio:
Anna De Rossi
Come fa il compilatore a capire se è {"Anna", "De Rossi"} oppure {"Anna De",
"Rossi"}. Una possibile soluzione, secondo me, è quella di usare un
carattere "legante" per unire la stringa del nome e quella del cognome, ad
esempio:
Maria_Chiara De_Rossi
poi il trattino (o un altro carattere a tua scelta, basta che sia un
carattere inutilizzato) viene eliminato in fase di memorizzazione (puoi fare
una funzione che scandisce la stringa e trasforma tutti i trattini in spazi
bianchi). In questo modo puoi comunque utilizzare la fscanf, altrimenti come
fa il programma a capire qual è il nome e quale il cognome? Spero di esserti
stato di aiuto. Ciao
                                                    Marchisio Stefano
P.S.: ti voglio dare ancora una piccola mano:
#include <string.h>
void correct (char *s)
{
for (int i = 0; i < strlen (s); i++)
  if (s [i] == '_')
   s [i] = ' ';
}
Così non ti danni l'anima per scrivere la funzioncina di correzione.