Fscaf

di il
20 risposte

Fscaf

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

  • Re: Fscaf

    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)
  • Re: Fscaf

    Ho capito il discorso dell'individuare la virgola, però io non so quanto è lunga la stringa perchè leggo riga per riga
  • Re: Fscaf

    Il valore indicato è il massimo. Avari indicato un massimo per il tuo array. no?
  • Re: Fscaf

    Ah ho capito, si ho indicato il massimo per l'array. Ora provo grazie mille
  • Re: Fscaf

    Devi usare il massimo-1 per il terminatore
  • Re: Fscaf

    Si si, una cosa perchè hai messo & se dummy è una char?
  • Re: Fscaf

    Perché la fscanf accetta i puntatori, dimenticato?
  • Re: Fscaf

    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;
    }
  • Re: Fscaf

    P.S. Se tolgo le virgole sul file il programma gira correttamente
  • Re: Fscaf

    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?
  • Re: Fscaf

    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
  • Re: Fscaf

    Nella fscanf tu indichi due stringhe

    %s %19[^,]%c

    ma nel file esiste solo una stringa
  • Re: Fscaf

    Allora mi sa che non ho capito come individuare e ignorare la virgola
  • Re: Fscaf

    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