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;
}