Programma in C mi da errore "dump creato"

di il
9 risposte

Programma in C mi da errore "dump creato"

Buongiorno, ho creato questo post perchè proprio non capisco cosa è che ho sbagliato nel codice. Non so magari è un errore di struct visto che faccio un pò fatica a comprendere come strutturarle di solito.

Testo esercizio: "Un insegnante di un liceo memorizza in un file tutti i voti conseguiti dai suoi studenti nelle verifiche dell’anno scolastico in corso. Il formato del file può essere dedotto dall’esempio a fianco. I nomi possono essere costituiti da più parole separate da uno spazio. Il numero massimo di voti per studente è 50 e il numero massimo di studenti è 100. Scopo dell’esercizio è generare un file di testo contenente, per ogni studente, l’elenco dei voti conseguiti e la media (arrotondata alla prima cifra decimale), nel formato che si può dedurre dall’esempio a fianco (attenzione al formato della data!). Gli studenti in tale file devono comparire nell’ordine in cui compaiono per la prima volta nel file di ingresso. Anche i voti devono
comparire nell’ordine in cui si trovano nel file di ingresso. Al termine dell’elenco dei voti di ogni studente deve essere scritta la media e una riga bianca di separazione dallo studente successivo (o dalla fine del file, nel caso dell’ultimo studente). Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file di ingresso e di un file di uscita e scriva nel file di uscita l’elenco dei voti conseguiti e la media come sopra descritto."

Formato file di input:
"Degli Specchi, Paola, 10/11/2020, 8.
Vignoni, Pier Paolo, 8/1/2021, 6.
Vai, Ugo, 10/11/2020, 10.
Degli Specchi, Paola, 7/12/2020, 9.
Vai, Ugo, 10/11/2020, 3.
Della Valle Di Sotto, Luigi, 7/12/2020, 5."

Formato file output:
"Paola Degli Specchi
2020-11-10 8
2020-12-7 9
MEDIA: 8.5

Pier Paolo Vignoni
2021-1-8 6
MEDIA: 6.0

Ugo Vai
2020-11-10 10
2020-11-10 3
MEDIA: 6.5

Luigi Della Valle Di Sotto
2020-12-7 5
MEDIA: 5.0MEDIA: 5.0

Codice scritto da me:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max_studenti 100
#define max_voti 50

struct _studente{
    char nome[20];
    char cognome[30];
    int cnt_voti;
    double media;

    struct _voto{

        int voto;

        struct _data{
            int giorno;
            int mese;
            int anno;
        } data;

    }voto[max_voti];

}studente[max_studenti];

int main (int argc, char *argv[])
{
    //argc di 3 file
    if(argc != 3)
    {
        printf("Inserire file di input e file di output");

        exit(EXIT_FAILURE);
    }
    //apertura file

    FILE *fp;

    fp = fopen(argv[1], "r");

    int j, i;

    char TempStringCognome[60];
    char TempStringNome[60];

    char ch, ca;
    int token;

    char cognome[30];
    char nome[40];

    ch=getchar();
    ca=getchar();


    for(j=0; j<max_studenti; j++)
    {
        studente[j].cnt_voti = 0;

        fgets(TempStringCognome, 60, fp);

        int N=0;
        int M=0;

        while (ch!=',')
        {
            ch=TempStringCognome[N];
            cognome[N]=ch;
            N++;
            ch=getchar();
        }

        cognome[N]='\0';

        //nome
        
        while (ca!=',')
        {
            ca = TempStringNome[M];
            nome[M]=ca;
            M++;
            ca = getchar();
        }

        nome[M]='\0';

        //verifica se cognome già presente

        token =0;

        for (i=0; i<max_studenti; i++)
        {
            if (strcmp(cognome, studente[i].cognome) == 0)
            {
                strcpy(studente[i].cognome, cognome);
                strcpy(studente[i].nome, nome);
                fscanf(fp,"%d %d %d %d", &studente[i].voto->data.giorno, &studente[i].voto->data.mese,
                &studente[i].voto->data.anno, &studente[i].voto->voto);
                token = 1;
                studente[i].cnt_voti = studente[i].cnt_voti + 1;
            }
        }

        if(token == 0)
        {
            strcpy(studente[j].cognome, cognome);
            strcpy(studente[i].nome, nome);
            fscanf(fp, "%d %d %d %d", &studente[j].voto->data.giorno, &studente[j].voto->data.mese, 
            &studente[j].voto->data.anno, &studente[j].voto->voto);
            studente[j].cnt_voti = 1;
        }

    }

    fclose(fp);

    //calcolo media

    for(j=0; j<max_studenti; j++)
    {
        for(i=0; i<max_voti; i++)
        {
            studente[j].media = studente[j].media +studente[j].voto[i].voto;
        }
        studente[j].media = (studente[j].media/studente[j].cnt_voti);
    }

    //scrittura file in uscita

    fp = fopen(argv[2], "w");

    for (i=0; i<max_studenti; i++)
    {
        fprintf(fp, "%s %s \n", studente[i].nome, studente[i].cognome);

        for(j=0; j<studente[i].cnt_voti; j++)
        {
            fprintf(fp, "%d-%d-%d %d\n", studente[i].voto[j].data.anno, studente[i].voto[j].data.mese, studente[i].voto[j].data.giorno,
            studente[i].voto[j].voto);
        }
        fprintf(fp,"MEDIA: %.1f", studente[i].media);
    }

    fclose(fp);

    return(EXIT_SUCCESS);

}
Se qualcuno riuscisse ad aiutarmi magari dandomi qualche consiglio o dirmi dove sbaglio ne sarei molto grato.
Grazie in anticipo!

9 Risposte

  • Re: Programma in C mi da errore "dump creato"

    Ma tutte quelle getchar() a che ti servono?
  • Re: Programma in C mi da errore "dump creato"

    oregon ha scritto:


    Ma tutte quelle getchar() a che ti servono?
    In pratica il nostro prof ci ha dato questo estratto da un esame di fondamenti di programmazione. Ci ha detto che la fscanf è inutilizzabile e che dovevamo con la fgets una riga intera e la salvo e da li posso manipolarla come voglio. Dicendoci di creare un ciclo while che copia lettera per lettera fino a che non incontra la virgola e poi aggiungere alla fine un \0 per terminare la stringa.
  • Re: Programma in C mi da errore "dump creato"

    Secondo me la parte di acquisizione sarebbe più comoda così
    int main(int argc, char** argv) {
        FILE *fp = fopen("input.txt", "r");
        if(fp == NULL){
            printf("File non trovato!");
    	return -1;
        }    
        char buffer[1000];
        int  riga = 0;
        while (fgets(buffer, sizeof(buffer), fp) != NULL){
            char *cp = strtok(buffer, ",");
            while (cp != NULL && riga < max_studenti){
                printf("%s\n", cp);
                cp = strtok(NULL, ",");
                riga++;
            }
        }    
        return (EXIT_SUCCESS);
    }
  • Re: Programma in C mi da errore "dump creato"

    La getchar lavora da tastiera, che c'entra con la fscanf?
  • Re: Programma in C mi da errore "dump creato"

    oregon ha scritto:


    La getchar lavora da tastiera, che c'entra con la fscanf?
    e allora cosa mi consigli di utilizzare?
  • Re: Programma in C mi da errore "dump creato"

    Il file lo puoi leggere con la fgets, come mostrato da Weierstrass. Ma anche con la fscanf, se hai un po' di pazienza.

    La getchar non ha assolutamente senso.
  • Re: Programma in C mi da errore "dump creato"

    oregon ha scritto:


    Il file lo puoi leggere con la fgets, come mostrato da Weierstrass. Ma anche con la fscanf, se hai un po' di pazienza.

    La getchar non ha assolutamente senso.
    OK adesso ho capito, grazie ancora
  • Re: Programma in C mi da errore "dump creato"

    Weierstrass ha scritto:


    Secondo me la parte di acquisizione sarebbe più comoda così
    int main(int argc, char** argv) {
        FILE *fp = fopen("input.txt", "r");
        if(fp == NULL){
            printf("File non trovato!");
    	return -1;
        }    
        char buffer[1000];
        int  riga = 0;
        while (fgets(buffer, sizeof(buffer), fp) != NULL){
            char *cp = strtok(buffer, ",");
            while (cp != NULL && riga < max_studenti){
                printf("%s\n", cp);
                cp = strtok(NULL, ",");
                riga++;
            }
        }    
        return (EXIT_SUCCESS);
    }
    Grazie mille adesso ho capito come renderlo più semplice
  • Re: Programma in C mi da errore "dump creato"

    Scusate se mi intrometto ma sarebbe buona abitudine mettere le costanti #define in maiuscolo per separarle dalle variabili e fare un codice più leggibile
Devi accedere o registrarti per scrivere nel forum
9 risposte