Fscaf

di Anonimizzato31136 il
20 risposte
Ciao a tutti, ho un dubbio con fscanf
Allora io so che fscaf legge parola per parola (o numeri se ci sono) e in codice sarebbe

while(fscanf(fp, "%s %s %d ", nome, cognome, &eta) != EOF)

Il mio dubbio sorge se nel file sono scritti spaziati da virgole, esempio: Mario Rossi, 56, i questo caso scrivo

while(fscanf(fp, "%s %s, %d", nome, cognome, &eta) != EOF) quindi mettendo la virgola in fscanf
oppure si usa fgets ?

20 Risposte

  • Puoi usare anche la fgets ma in quel caso devi suddividere tu le parti della stringa letta.

    Con la fscanf devi individuare e scartare la virgola. Se la lunghezza dell'array cognome è di 50, ad esempio

    char dummy;

    while(fscanf(fp, "%s %49[^,]%c %d", nome, cognome, &dummy, &eta) != EOF)
  • Ho capito il discorso dell'individuare la virgola, però io non so quanto è lunga la stringa perchè leggo riga per riga
  • Il valore indicato è il massimo. Avari indicato un massimo per il tuo array. no?
  • Ah ho capito, si ho indicato il massimo per l'array. Ora provo grazie mille
  • Devi usare il massimo-1 per il terminatore
  • Si si, una cosa perchè hai messo & se dummy è una char?
  • Perché la fscanf accetta i puntatori, dimenticato?
  • Si lo sapevo, ma pensavo che essendo una char ed una char essendo una stringa punta all'indirizzo del suo primo elemento.
    comunque facendo cosi non mi gira il programma, il file è strutturato cosi:
    nome_squadra, codice goal_fatti goal_subiti
    es: juventus, 1 7 8
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define NMAX 10
    
    struct squadra
    {
        char nome[20];
        int codice;
        int goal_fatti;
        int goal_subiti;
    };
    
    struct squadra leggi_squadre(char filesquadre[], char codice[]);
    void aggiorna_elenco(struct squadra s[], char nome[], int cod, int goal_fatti, int goal_subiti, int *nsquadre);
    struct squadra trova_squadra(struct squadra s[], char codice[], int nsquadre);
    
    int main(int argc, char *argv[])
    {
        struct squadra s;
    
        if(argc != 3)
        {
            printf("Inserisci: <filesquadre> <CODICE>");
            exit(EXIT_FAILURE);
        }
        s = leggi_squadre(argv[1], argv[2]);
    
        printf("\n------------------------------------------------------\n");
        printf("Squadra    goal fatti    goal subiti\n");
        printf("%3s %11d %13d", s.nome, s.goal_fatti, s.goal_subiti);
        
        return EXIT_SUCCESS;
    }
    struct squadra leggi_squadre(char filesquadre[], char codice[])
    {
        FILE *fp;
        struct squadra s[NMAX], squadra_cercata;
        char nome[20], virgola;
        int cod, goal_fatti, goal_subiti;
        int nsquadre=0;
    
        if((fp = fopen(filesquadre, "r")) == NULL)
        {
            printf("Errore apertura del file!!!");
            exit(EXIT_FAILURE);
        }
        
        printf("Le squadre con la differenza reti positiva: \n");
        printf("Squadra    codice");
        while(fscanf(fp, "%s %19[^,]%c %d %d %d", nome, &virgola, &cod, &goal_fatti, &goal_subiti ) != EOF)
        {
            aggiorna_elenco(s, nome, cod, goal_fatti, goal_subiti, &nsquadre);
        }
    
        squadra_cercata = trova_squadra(s, codice, nsquadre);
    
        return squadra_cercata;
    }
    void aggiorna_elenco(struct squadra s[], char nome[], int cod, int goal_fatti, int goal_subiti, int *nsquadre)
    {
        strcpy(s[*nsquadre].nome, nome);
        s[*nsquadre].codice = cod;
        s[*nsquadre].goal_fatti = goal_fatti;
        s[*nsquadre].goal_subiti = goal_subiti;
    
        if(s[*nsquadre].goal_fatti > s[*nsquadre].goal_subiti)
        {
            printf("\n%s %9d", s[*nsquadre].nome, s[*nsquadre].codice);
        }
        (*nsquadre)++;
    
        return;
    }
    struct squadra trova_squadra(struct squadra s[], char codice[], int nsquadre)
    {
        struct squadra c;
        int i;
    
        for(i=0; i<nsquadre; i++)
        {
            if(s[i].codice == atoi(codice))
            {
                c = s[i];
            }
        }
        
        return c;
    }
  • P.S. Se tolgo le virgole sul file il programma gira correttamente
  • Un array di char è una stringa, non un char. Un char NON è un array di char.


    Che vuol dire "non mi gira il programma"?

    Cosa leggi effettivamente dal file? Cosa contiene realmente?
  • Questo è quello che contiene il file
    juventus, 1 10 12
    milan, 8 7 6
    inter, 10 13 11
    bologna, 2 9 10
    lazio, 5 8 4
    udinese, 14 5 7
    Invece non mi gira il programma vuol dire che quando lo eseguo non fa quello che deve fare
  • Nella fscanf tu indichi due stringhe

    %s %19[^,]%c

    ma nel file esiste solo una stringa
  • Allora mi sa che non ho capito come individuare e ignorare la virgola
  • Nel tuo primo esempio avevi nome e cognome, quindi due stringhe %s %s e su quello ti ho fatto l'esempio.

    Se in realtà la stringa è una sola, la squadra, allora è solo

    %19[^,]%c

    Bisogna fare gli esempi che poi si utilizzano, non altri.
Devi accedere o registrarti per scrivere nel forum
20 risposte