Certo, eccolo qui. Posto anche la consegna dell'esercizio e il file da cui effettuare la lettura

Consegna:
codice:
Scrivere un programma che effettui la lettura di un file anagrafico in funzione read_file e che consenta una successiva ricerca tramite cognome e nome in una funzione search. Il file si apre con il numero di persone i cui dati sono memorizzati nel file.
File:
codice:
3
luca bianchi 19 7 1986
mario rossi 21 11 1965
andrea verdi 1 1 1998
Codice:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SLEN 31

typedef struct persona
{
    char name[SLEN];
    char surname[SLEN];
    int day, month, year;
} PERSONA;

void read_file_1 (char* filename, PERSONA** list, int* dim);
PERSONA* read_file_2 (char* filename, int* dim);
PERSONA* search (PERSONA* list, const int dim);

int main (int argc, char *argv[])
{
    char fname[SLEN];
    PERSONA* list = NULL;
    PERSONA* occ = NULL;
    int dim;

    printf("file: ");
    scanf("%s",fname);

    read_file_1(fname,&list,&dim);
    // list = read_file_2(fname,&dim);

    if (list==NULL)
    {
        printf("caricamento fallito\n");
        return -1;
    }

    occ = search(list,dim);

    if (occ == NULL)
        printf("\nnessun elemento trovato\n");
    else
    {
        printf("\nla ricerca ha prodotto il seguente risultato:\n\t");
        printf("%s %s %d %d %d\n",occ->name,occ->surname,occ->day,occ->month,occ->year);
    }

    free(list);

    return 0;
}

void read_file_1 (char* filename, PERSONA** list, int* dim)
{
    FILE *input = NULL;
    int i;

    if ((input=fopen(filename,"r"))==NULL)
    {
        printf("errore apertura file\n");
        return;
    }

    fscanf(input,"%d",dim);

    *list = (PERSONA*)malloc(*dim*sizeof(PERSONA));

    if (*list == NULL)
    {
        printf("errore allocazione memoria\n");
        return;
    }

    for (i=0; i<*dim; i++)
    {
        fscanf(input, "%s", (*list)[i].name);
        fscanf(input, "%s", (*list)[i].surname);
        fscanf(input, "%d", &((*list)[i].day));
        fscanf(input, "%d", &((*list)[i].month));
        fscanf(input, "%d", &((*list)[i].year));
    }

    fclose(input);

    return;
}

PERSONA* read_file_2 (char* filename, int* dim)
{
    PERSONA* list = NULL;
    FILE *input = NULL;
    int i;

    if ((input=fopen(filename,"r"))==NULL)
    {
        printf("errore apertura file\n");
        return NULL;
    }

    fscanf(input,"%d",dim);

    list = (PERSONA*)malloc(*dim*sizeof(PERSONA));

    if (list == NULL)
        return NULL;

    for (i=0; i<*dim; i++)
    {
        fscanf(input,"%s",list[i].name);
        fscanf(input,"%s",list[i].surname);
        fscanf(input,"%d",&(list[i].day));
        fscanf(input,"%d",&(list[i].month));
        fscanf(input,"%d",&(list[i].year));
    }

    fclose(input);

    return list;
}

PERSONA* search (PERSONA* list, const int dim)
{
    PERSONA* occ = NULL;
    char searchname[SLEN], searchsurname[SLEN];
    int i;

    printf("\nnome: ");
    scanf("%s",searchname);
    printf("cognome: ");
    scanf("%s",searchsurname);

    for (i=0; i<dim; i++)
        if ( strcasecmp(searchname,list[i].name)==0 && strcasecmp(searchsurname,list[i].surname)==0 )
            occ = list+i;

    return occ;
}