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.