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.