Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10

    [C] Segmentation fault da fscanf

    Ho questo codice e la seconda fscanf (quella nell'acquisizione delle spese) mi da segmentation fault. Perchè? Mi sembra sia molto simile alla prima, perchè la prima non mi da problemi?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 50
    //nel file clienti.txt c'è, in ogni riga, nome cognome città nomefile
    //ogni cliente ha associato un file spese con: causale prezzo
    
    typedef struct spese { char *causale;
                            float prezzo;
                            struct spese *next;
                            }SPESE;
    
    
    typedef struct clienti{
                            char* nome;
                            char* cognome;
                            char* citta;
                            char*nomefile;
                            SPESE* spesa;
                            struct clienti *next;
    
                            }CLIENTI;
    
    
    
    int main()
    {
        FILE *fp=NULL;
        FILE *fp2=NULL;
    
        fp=fopen("clienti.txt","r");
        if (fp==NULL)return -1;
        
        char buff[N],buff1[N],buff2[N],buff3[N],buff4[N];
        float prezzo=0;
        CLIENTI *p=NULL;
        CLIENTI *testa=NULL;
        SPESE  *p_spesa=NULL;
    
    
    //acquisizione clienti
    
        while(fscanf(fp,"%s %s %s %s",buff, buff1, buff2, buff3)!=EOF){
    
    printf("%s %s %s %s\n",buff, buff1, buff2, buff3);
    
        p=(CLIENTI*)malloc(sizeof(CLIENTI));
            p->nome=(char*)malloc((strlen(buff)+1)*sizeof(char));
        strcpy(p->nome, buff);
         p->cognome=(char*)malloc((strlen(buff1)+1)*sizeof(char));
        strcpy(p->cognome, buff1);
         p->citta=(char*)malloc((strlen(buff2)+1)*sizeof(char));
        strcpy(p->citta, buff2);
        p->nomefile=(char*)malloc((strlen(buff3)+1)*sizeof(char));
        strcpy(p->nomefile, buff3);
        p->next=testa;
    
        testa=p;
        }
        fclose(fp);
    //acquisizione spese
       p=testa;
        while(p!=NULL){
            fp2=(p->nomefile,"r");
            if(fp2==NULL)return -3;
    
    
            while(fscanf(fp2,"%s %f",buff4, &prezzo)!=EOF){   //questa è la fscanf che da SEGMENTATION FAULT
    
            p_spesa=(SPESE*)malloc(sizeof(SPESE));
            p_spesa->causale=(char*)malloc((strlen(buff4)+1)*sizeof(char));
            strcpy(p_spesa->causale,buff4);
            p_spesa->prezzo=prezzo;
            p_spesa->next=p->spesa;
            p->spesa=p_spesa;
            }
        fclose(fp2);
        p=p->next;
        }
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Bisogna controllare cosa legge dal file
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    I file che uso sono questi

    clienti.txt
    marco rossi torino rossi.txt
    luca verdi monza verdi.txt
    enrico bianchi venezia bianchi.txt

    rossi.txt
    eee 99.54
    ppp 12.1
    dad 4.69

    verdi.txt
    aaa 45
    bbb 10.25

    bianchi.txt
    abc 44.55
    dfa 12.00

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A me non succede.

    Ovviamente ho visto questa

    fp2=(p->nomefile,"r");

    che dovrebbe essere

    fp2=fopen(p->nomefile,"r");
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    Che errore del cavolo, strano che non me lo segnali però! Pazienza, ti ringrazio!

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