Ok grazie per la tua risposta!
Sto facendo un programma dove devo leggere da un primo file una lista di dipendenti di un'azienda e memorizzarne l'intero contenuto in una lista LIFO.(questo l'ho fatto). Poi devo memorizzare l'elenco ordinato sul secondo file.

Ho fatto tutto ma non si crea il secondo file dove dovrebbe esserci tutto ordinato.
Ecco il codice:

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 50+1

struct myStruct {
       char *cognomeNome;
       char *codiceFiscale;
       int numSettLavorate;
       int **matrice;
       int totaleOreLavorate;
       struct myStruct *nextPtr;
       };
typedef struct myStruct STRUCT;

STRUCT *readFile( FILE *fr, STRUCT *head, char *cognome, char *nome, char *codFiscale, int numSettLav);
void writeFile( FILE *fw, STRUCT *head );
void dealloca( STRUCT *head);

int main( int argc, char **argv )
{
    char cognome[MAX], nome[MAX], codFiscale[17];
    int numSettLav;
    FILE *fr, *fw;
    STRUCT *head = NULL;
    
    if ( argc != 3 )
    {
         fprintf(stdout,"Run program as:\n /name <fileIn> <fileOut>\n");
         fflush(stdout);
         exit(1);
    }
    
    fr = fopen(argv[1], "r");
    fw = fopen(argv[2], "w");
    if( fr == NULL || fw == NULL )
    {
        printf("Errore di apertura del file\n");
        exit(1);
    }
    
    while( fscanf(fr, "%s%s%s%d", cognome, nome, codFiscale, &numSettLav) != EOF )
    {
           head = readFile(fr, head, cognome, nome, codFiscale, numSettLav);
    }
    
    writeFile(fw, head);
    
    dealloca(head);
    
    fclose(fr);
    fclose(fw);
    
    system("pause");
    
}

STRUCT *readFile( FILE *fr, STRUCT *head, char *cognome, char *nome, char *codFiscale, int numSettLav )
{
       STRUCT *e, *p1, *p2;
       char buf[MAX * 2];
       int numSettimana, numGiorniLav, i, j;
       
       e = (STRUCT *) malloc(sizeof(STRUCT));
       if( e == NULL )
       {
           fprintf(stderr, "Errore di allocazione\n");
           exit(1);
       }
       strcpy(buf, cognome);
       strcat(buf, " ");
       strcat(buf, nome);
       e->cognomeNome = (char *) malloc((strlen(buf) + 1) * sizeof(char));
       if( e->cognomeNome == NULL )
       {
           fprintf(stderr, "Errore di allocazione.\n");
           exit(1);
       }
       strcpy(e->cognomeNome, buf);
       strcpy(e->codiceFiscale, codFiscale);
       e->numSettLavorate = numSettLav;
       
       e->totaleOreLavorate = 0;
       
       e->matrice = (int **) malloc(numSettLav * sizeof(int *));
       if( e->matrice == NULL )
       {
           printf("Errore di allocazione.\n");
           exit(1);
       }
       for( i = 0; i < numSettLav; i++ )
       {
            fscanf(fr, "%d %d", &numSettimana, &numGiorniLav);
            if( e->matrice[i] == NULL )
            {
                printf("Errore di allocazione.\n");
                exit(1);
            }
            e->matrice[i][0] = numSettimana;
            e->matrice[i][1] = numGiorniLav;
            
            for( j = 0; j < numGiorniLav; j++ )
            {
                 fscanf(fr, "%d ", &e->matrice[i][j + 2]);
                 e->totaleOreLavorate = e->totaleOreLavorate + e->matrice[i][j + 2];
            }
       }
       
       if( head == NULL || (e->totaleOreLavorate) < (head->totaleOreLavorate))
       {
           e->nextPtr = head;
           return(e);
       }
       
       p1 = head;
       p2 = head->nextPtr;
       while( p2 != NULL && (p2->totaleOreLavorate) < (e->totaleOreLavorate) )
       {
              p1 = p2;
              p1->nextPtr = p2->nextPtr; /* non sono sicuro */
       }
       p1->nextPtr = e;
       e->nextPtr = p2;
       
       return(head);
       
}

void writeFile( FILE *fw, STRUCT *head )
{
     int i, j;
     STRUCT *e;
     
     e = head;
     
     while( e != NULL )
     {
            fprintf(fw, "%s %s %d\n", e->cognomeNome, e->codiceFiscale, e->numSettLavorate);
            
            for( i = 0; i < e->numSettLavorate; i++ )
            {
                 for( j = 0; j < e->matrice[i][1]+2; j++ )
                 {
                      fprintf(fw, "%d ", e->matrice[i][j]);
                 }
                 fprintf(fw, "\n");
            }
            e = e->nextPtr;
     }
     return;
}

void dealloca( STRUCT *head )
{
     int i;
     STRUCT *e;
     
     while( head != NULL )
     {
            for( i = 0; i < head->numSettLavorate; i++ )
            {
                 free(head->matrice[i]);
            }
            free(head->matrice);
            free(head->cognomeNome);
            e = head;
            head = head->nextPtr;
            free(e);
     }
     return;
}