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

    [C] Leggere un file formattato e stampare il contenuto

    Buongiorno a tutti, ho riscontrato un problema in un esercizio che richiedeva di leggere dei dati da un file di testo relativi a una gara e di memorizzarli in una lista. Il file è così formattato: nome;cognome;minuti'secondi''centesimi. Successivamente stampare nome e cognome dei partecipanti.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct gara *gara_link;
    struct gara{
        char *nome;
        char *cognome;
        int tempo;
        gara_link next;
    };
    
    
    int main()
    {
        FILE *fp = fopen ("risultati.txt", "r");
        if (fp == NULL) {
            printf("Impossibile aprire file risultati.txt");
        }
    
    
    
    
        struct gara user;
        user.nome = malloc (15 * sizeof(char));
        user.cognome = malloc (15 * sizeof(char));
        
    
    
        while (!feof(fp)) {
            fscanf(fp, "%20[^;];%30[^;]", user.nome, user.cognome);
        }
        printf("%s %s", user.nome, user.cognome);
        return 0;
    }
    Mi hanno consigliato di usare la fscanf con l'operatore %20[^;], dove %20 comporta la lettura di 20 caratteri prima del ';' ma non sono sicuro di ciò. Grazie dell'attenzione

  2. #2
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct gara *gara_link;
    struct gara{
        char *nome;
        char *cognome;
        int tempo;
        gara_link next;
    };
    
    
    int main()
    {
        FILE *fp = fopen ("risultati.txt", "r");
        if (fp == NULL) {
            printf("Impossibile aprire file risultati.txt");
        }
    
    
        struct gara user;
        user.nome = malloc (15 * sizeof(char));
        user.cognome = malloc (15 * sizeof(char));
        /* char tempo = malloc (15 * sizeof(int)); */
    
    
        while (!feof(fp)) {
                fscanf(fp, "%10[^;];%15[^;];%10[^\n];", user.nome, user.cognome, user.tempo);
                printf("%s %s %s", user.nome, user.cognome, user.tempo);
        }
        return 0;
    }
    Ho modificato l'ultima parte, tuttavia ho dovuto leggere il terzo parametro come stringa, come posso fare a leggerlo come intero? Siccome dopo dovrò calcolare il tempo più veloce... Grazie

  3. #3
    Ciao, penso sia meglio usare fgets() & strtok() (devi includere "string.h)
    codice:
    int main()
    {
        struct gara user;
        char buffer[512] = "";
        char *pt = 0;
        const int StringSize = 15; /* Lunghezza delle stringhe */
        
        FILE *fp = fopen ("risultati.txt", "r");
        if (fp == NULL)
        {
            printf("Impossibile aprire file \"risultati.txt\"");
            getchar();
            exit(EXIT_FAILURE);
        }
    
        user.nome = malloc (StringSize * sizeof(char));
        user.cognome = malloc (StringSize * sizeof(char));
        
        while ( (fgets( buffer, 512, fp ) ) != NULL )
        {
            pt = strtok( buffer, ";" );
            strncpy( user.nome, pt, StringSize-1);
            /* strncpy : no null-character is implicitly appended at
               the end of destination if source is longer than num. */
            user.nome[StringSize-1] = 0;
            
            pt = strtok( NULL, ";" );
            strncpy( user.cognome, pt, StringSize-1);
            /* strncpy : no null-character ... */
            user.cognome[StringSize-1] = 0;
            
            printf("Nome = \"%s\" \tCognome = \"%s\"\n", user.nome, user.cognome);
            getchar();
        }
        return (EXIT_SUCCESS);
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Quote Originariamente inviata da Samuele_70 Visualizza il messaggio
    Ciao, penso sia meglio usare fgets() & strtok() (devi includere "string.h)
    codice:
    int main()
    {
        struct gara user;
        char buffer[512] = "";
        char *pt = 0;
        const int StringSize = 15; /* Lunghezza delle stringhe */
        
        FILE *fp = fopen ("risultati.txt", "r");
        if (fp == NULL)
        {
            printf("Impossibile aprire file \"risultati.txt\"");
            getchar();
            exit(EXIT_FAILURE);
        }
    
        user.nome = malloc (StringSize * sizeof(char));
        user.cognome = malloc (StringSize * sizeof(char));
        
        while ( (fgets( buffer, 512, fp ) ) != NULL )
        {
            pt = strtok( buffer, ";" );
            strncpy( user.nome, pt, StringSize-1);
            /* strncpy : no null-character is implicitly appended at
               the end of destination if source is longer than num. */
            user.nome[StringSize-1] = 0;
            
            pt = strtok( NULL, ";" );
            strncpy( user.cognome, pt, StringSize-1);
            /* strncpy : no null-character ... */
            user.cognome[StringSize-1] = 0;
            
            printf("Nome = \"%s\" \tCognome = \"%s\"\n", user.nome, user.cognome);
            getchar();
        }
        return (EXIT_SUCCESS);
    }
    Grazie della risposta, ho dimenticato di specificare che non posso usare array statici.. Inoltre non so se hai visto il mio secondo messaggio, sopra al tuo, ma dovrei leggere la tempistica come intero, come faccio con fgets?
    Ultima modifica di fabio.beginner; 09-09-2014 a 22:16

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.