Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    86

    [c]programma non scrive sul file e non funziona

    ragazzi perchè non mi funziona questo programma e neanche mi scrive sul file

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>//vedi i commenti successivi perchè ho aggiunto questo
    #define N 31//Perchè hai messo 31??? Se questo indica la lunghezza di max 30 dei campi nome, cognome e regione dovrebbe essere 29 in quanto da 0 a 29 ci sono 30 cifre.
    #define M 11
    #define P 110
    
    
    //doversti creare la struttura studenti e dentro quella della data
    typedef struct studente{
        char nome[N];
        char cognome[N];
        char regione[N];
        struct data{
            int gg;
            int mm;
            int aaaa;
        }data;
        char area;
    }studente;
    
    int main(int argc,char*argv[])
    {
    FILE*fp;
    char str[P];//non capisco a cosa serve
    char nome[N];
    char cognome[N];
    char regione[N];
    struct studente stud;
    char area;
    int count1=0;//Quando devi usare una variabile per contare qualcosa va sempre messa a zero perchè è possibile che non ci siano elementi che soddisfano la condizione
    int count2=1;//Stessa cosa di sopra
    int i, j;
    int max=0;
    int min=INT_MAX;//Di solito va il massimo valore che il tipo della variabile può avere. Ti consiglio quindi di usare la libreria limits.h e di usare la costante INT_MAX
    int n=0;
    char regioni[20];//serve per vedere quali regioni ho già controllato per eseguire il punto 2. l'ho fatto di 20 perchè 20 sono le regioni italiane
    
    if(argc!=2){
        printf("\n errore linea di comando");
        return -1;
    }
    
    fp=fopen(argv[1],"r");
    if(fp==NULL){
        printf("\n errore apertura file");
        return -2;
    }
    //////////////////// Scrivo dei nomi sul file per vedere se il programma funziona
    printf("scrivo");
    studente studScrivi;
        studScrivi.area='I';
        strcpy (studScrivi.cognome,"scardigno");
        studScrivi.data.aaaa=2012;
        studScrivi.data.gg=30;
        studScrivi.data.mm=8;
        strcpy (studScrivi.nome,"antonio");
        strcpy (studScrivi.regione,"puglia");
        FILE *f;
        size_t len;
        if ((f = fopen (argv[1],"r")) != NULL)
        {
            fwrite (&studScrivi,  sizeof (studente),1, f);
    
            if (len == sizeof (studente))
                printf ("Scrittura OK\n");
    
            fclose (f);
        }
    //////////////////////////////////////////////////////////////
    
    while(fscanf(fp,"%s %s %s %i %i %i %c", &stud.nome, &stud.cognome, &stud.regione, &stud.data.gg, &stud.data.mm, &stud.data.aaaa, &stud.area)!=EOF){
    
        printf("ok");//sscanf(,"%d/%d/%d",&data.gg,&data.mm,&data.yyyy); questa non serve perchè i dati dello studente li leggiamo precedentemente
        if(stud.data.mm>=9 || stud.data.mm<=4){//i mesi devono essere maggiore e uguale e minore e uguale altrimenti i mesi di settembre e aprile non sono compresi
            printf("\n immatricolazione non valida");
        }
        //for(i=0,n=i+1;i<strlen(str);i++){ sei già all'inerno del while che esamina gli studenti uno ad uno non serve
            //if(strcmp(regione[i],regione[n])==0){
            //ora conto gli studenti di una stessa regione e salvo la regione dello studente attuale nel vettore regioni così evito di stampare dati relativi alla stessa regione
            for (j=0; j<sizeof(regioni); j++)
                if (strcmp(stud.regione,regioni[j])==0) return -4;
                if(stud.area=='I'){
                    count1++;
                }
                if(stud.area=='A'){
                    count2++;
                }
                //if((count1+count2)>max){
                //    max=(count1+count2);
                //}
                //else{
                //    if((count1+count2)<min)
                //       min=(count1+count2);
                //}
                printf("\n la regione %s ha un numero di iscritti ad ingegneria pari a %d e in architettura pari a %d",stud.regione,count1,count2);
            }
            // questa riga di codice va messa nel ciclo, quindi prima della graffa qua sopra printf("\n la regione %s ha un numero di iscritti ad ingegneria pari a %d e in architettura pari a %d",regione[n],count1,count2);
            //printf("\n la regione da cui provengono più studenti è %s con %d studenti",regione[n],max);
            //printf("\n la regione da cui provengono meno studenti è %s con %d studenti",regione[n],min);
        //}
        //count1=1;
        //for(i=0,n=i+1;i<strlen(str);i++){
        //    if(data[i].mm==data[n].mm){
        //        count1++;
        //    }
        //    printf("\n nel mese %d il numero totale di immatricolati è %d",data[i].mm,count1);
        //}
    fclose(fp);
    return 0;
    }
    per favore e grazie

  2. #2

    Moderazione

    "Non funziona" non vuol dire niente... che problema dà esattamente?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    86
    non fa niente XD D: lo compila seza errori e non fa niente! non scrive ne su file e e stampa nient! D:

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Non ti scrive perché apri il file in sola lettura:
    fopen (argv[1],"r")

    Cambialo in:
    f = fopen (argv[1],"a")
    se vuoi scrivere al fondo del file per esempio.

    Detto questo c'è una iniziale:
    fp=fopen(argv[1],"r");
    che puoi anche togliere intanto fp non lo usi
    (o usi fp o usi f)

    Ciao.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    86
    grazieeeeeeeeeeeeeee ora me lo scrive perà va in errore D: mi arriva al punto dove mi stampa "ok" poi va in errore D: jelp please D:

  6. #6
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    codice:
    ...
    char regioni[20]
    ...
    
    ...
    if (strcmp(stud.regione,regioni[j])==0) return -4;
    ...
    Qui tenti di confrontare una stringa (char *) con un carattere (char), regioni dovrebbe essere un array di stringhe opportunamente inizializzato.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.