Strutture e file. Perché non cicla?

di il
5 risposte

Strutture e file. Perché non cicla?

Buonasera,
data la seguente struttura

typedef struct utente{
int userid;
int eta;
int genere;
int num_film;
char occupazione[20];
} utente;

e l'array di struttura
utente utenti[100];

la seguente porzione di codice non funziona a dovere:
FILE *dest;
    if((dest = fopen("users.txt", "r")) == NULL)
    printf("Impossibile leggere il file. ");
    else

        for (int i=1; i<100; i++){                //************INIZIO CICLO FOR**********
            		fscanf(dest,"%s\n", &test2); //legge i numeri dal file
                    printf(" %s\n", test2);
                    line = test2;

		utenti[i].userid = strtok(line, ",");
            printf(" %s \n", utenti[i].userid);

            utenti[i].eta = strtok(NULL, ",");
            printf(" %s \n", utenti[i].eta);

            utenti[i].genere = strtok(NULL, ",");
            printf(" %s \n", utenti[i].genere);

            utenti[i].num_film = strtok(NULL, ",");
            printf(" %s \n", utenti[i].num_film);

            strcpy(utenti[i].occupazione , strtok(NULL, ","));
            printf(" %s \n", utenti[i].occupazione);
        }//FINE CICLO FOR*****************************************************************************

    fclose(dest);

printf(" %s \n", utenti[33].genere);
printf(" %s \n", utenti[33].num_film);
printf(" %s \n", utenti[96].genere);
printf(" %s \n", utenti[96].num_film);

Perché?

Quando eseguo il programma scorre tutti i record presenti nel file ma poi dalla stampa di
printf(" %s \n", utenti[33].genere);
printf(" %s \n", utenti[33].num_film);
printf(" %s \n", utenti[96].genere);
printf(" %s \n", utenti[96].num_film);
capisco che l'array di struct contiene solo l'ultimo elemento.

Quando provo a scrivere un altro file prendendo i dati dall'array con il codice
   FILE *destinazione;
    if((destinazione = fopen("users_ordinati.txt", "w")) == NULL)
    printf("Impossibile scrivere sul file. n");
    else

        for (int i=0; i<100; i++){//INIZIO CICLO FOR*****************************************************************************
            		fprintf(destinazione,"%s\n", utenti[i].userid); //legge i numeri dal file

        }//FINE CICLO FOR*****************************************************************************
    fclose(destinazione);//
si ripropone lo stesso problema. Sembra che l'array contenga in tutte le sue 100 posizioni solo l'ultima serie di dati.

Grazie

5 Risposte

  • Re: Strutture e file. Perché non cicla?

    Intanto perché il ciclo di lettura comincia da 1 e non da 0? E poi il file dei dati contiene effettivamente 100 righe con dati diversi? Lo hai controllato?
  • Re: Strutture e file. Perché non cicla?

    I=1 è una distrazione. Effettivamente deve essere i=0.
    Ho utilizzato il cilco for con i<100 perché i dati sono effettivamente 100.
    Voglio prima capire bene. Effettivamente in un secondo momento ho pensato di sostituire il ciclo for con while(!feof(dest)){

    Resta il fatto che già con 100 record non funziona e sono molto deluso da me stesso.
  • Re: Strutture e file. Perché non cicla?

    Puoi postare tutto il codice con il main e il file dati?
  • Re: Strutture e file. Perché non cicla?

    Codice
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h>
    
    #define MAX 100
    
    main ()
    {
        typedef struct utente{
        int userid;
        int eta;
        int genere;
        int num_film;
        char occupazione[20];
        } utente;
    
        utente test;
        utente utenti[100];
        char* line;
        char* token;
        char test2[100];
    
        FILE *dest;
        if((dest = fopen("users.txt", "r")) == NULL)
        printf("Impossibile legegre sul file. n");
        else
    
            for (int i=0; i<100; i++){//INIZIO CICLO FOR*****************************************************************************
                		fscanf(dest,"%s\n", &test2); 
                        printf(" %s\n", test2);
                        line = test2;
    
    		utenti[i].userid = strtok(line, ",");
                printf(" %s \n", utenti[i].userid);
    
                utenti[i].eta = strtok(NULL, ",");
                printf(" %s \n", utenti[i].eta);
    
                utenti[i].genere = strtok(NULL, ",");
                printf(" %s \n", utenti[i].genere);
    
                utenti[i].num_film = strtok(NULL, ",");
                printf(" %s \n", utenti[i].num_film);
    
                strcpy(utenti[i].occupazione , strtok(NULL, ","));
                printf(" %s \n", utenti[i].occupazione);
            }//FINE CICLO FOR*****************************************************************************
    
        fclose(dest);
    
    printf(" %s \n", utenti[1].genere);
    printf(" %s \n", utenti[1].num_film);
    printf(" %s \n", utenti[33].genere);
    printf(" %s \n", utenti[33].num_film);
    printf(" %s \n", utenti[98].genere);
    printf(" %s \n", utenti[98].num_film);
    printf(" %s \n", utenti[96].genere);
    printf(" %s \n", utenti[96].num_film);
    
       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
       FILE *destinazione;
        if((destinazione = fopen("users_ordinati.txt", "w")) == NULL)
        printf("Impossibile scrivere sul file. n");
        else
    
            for (int i=0; i<100; i++){//INIZIO CICLO FOR*******************************
            
                		fprintf(destinazione,"%s\n", utenti[i].userid); //legge i numeri dal file
    
            }//FINE CICLO FOR*****************************************************************************
    
    
    
        fclose(destinazione);//Do not f
    
    
    system("pause");
    return 0;
    }
    
    
    I dati sono contenuti in un file di testo del tipo:

    137,50,M,8,operaio
    139,20,M,24,studente
    140,30,F,6,studente
    141,49,M,6,professore
    144,53,M,5,professore
    182,36,M,9,professore
    184,37,M,8,prete
    185,53,F,2,prete
    187,26,M,11,operaio
    188,42,M,9,studente
    19,40,M,21,prete
  • Re: Strutture e file. Perché non cicla?

    Errore trovato. Cercavo di inserire una stringa in un integer. Poiché a video andava, pensavo che si trattasse di una sottigiezza da sistemare con l'ottimizzazione. Invece no.
    Grazie
Devi accedere o registrarti per scrivere nel forum
5 risposte