Non riesco a far andare questo programma:
Ho un file di ingresso (file_di_ingresso.txt) di questo tipo:
1 file_giro_1.txt
2 file_giro_2.txt
Dove 1 e' il numero del giro, file_giro_1 il nome, ed a sua volta file_giro_1 conterra'
1 Raikkonen Ferrari 62
2 Massa Ferrari 61
3 Heidfeld BMW 74
Mentre il secondo per esempio
1 Raikkonen Ferrari 63
2 Massa Ferrari 60
3 Heidfeld BMW 78
Il mio problema e' soprattutto in lettura, voglio fare una lista di liste, ed una funzione apri_file recursiva che alla prima chiamata passandole come filename "fake" capisca che e' all'inizio e che quindi deve chiedere il primo nome file (quello che contiene poi tutti gli altri dei giri)
Son quasi sicuro che il problema e' nell'uso dei puntatori, cosa sbaglio?
Questo il mio main.c
Ringrazio in anticipo qualsiasi anima pia mi vorra' aiutare
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define DIM 21
typedef struct BASE_t
{
int numero;
char nome[DIM];
char scuderia[DIM];
int tempo_sul_giro;
struct BASE_t *next;
}BASE;
typedef BASE *base;
typedef struct giro_t
{
int numero_giro;
char nome_file_giro[DIM];
BASE info;
struct giro_t *next;
}giro;
typedef giro *list;
list apri_file(char *filename, int numero_giro, list *tmp);
void carica_giro(base *piloti, FILE *stream);
void stampa(list P_testa);
int main()
{
list P_testa = NULL;
char filename[DIM];
strcpy(filename, "fake");
P_testa = apri_file(filename, 0, &P_testa);
stampa(P_testa);
return 0;
}
list apri_file(char *filename, int numero_giro, list *tmp2)
{
FILE *stream;
list tmp, sentinella, P_coda;
if(strcmp(filename, "fake") == 0)
{
printf("\nInserisci il nome del file da aprire:\t");
scanf("%s", filename);
if( (stream = fopen(filename, "r") ) == NULL)
printf("\nErrore nell'apertura del file '%s'!\n", filename);
else
{
sentinella = calloc(1, sizeof(giro) );
P_coda = sentinella;
while(fscanf(stream, "%d%s", &numero_giro, filename) != EOF)
{
tmp = calloc(1, sizeof(giro) );
tmp -> numero_giro = numero_giro;
strcpy(tmp -> nome_file_giro, filename);
apri_file(filename, numero_giro, &tmp);
P_coda -> next = tmp;
P_coda = tmp;
}
}
}
else
{
if( (stream = fopen(filename, "r") ) == NULL)
printf("\nErrore nell'apertura del file '%s'\n", filename);
else
carica_giro(&( (*tmp2) -> info), stream);
}
return sentinella -> next;
}
void carica_giro(base *piloti, FILE *stream)
{
int numero_pilota, tempo_sul_giro;
char nome_pilota[DIM], scuderia_pilota[DIM];
base tmp;
piloti = calloc(1, sizeof(BASE) ); //sentinella
while(fscanf(stream, "%i%s%s%i", &numero_pilota, nome_pilota, scuderia_pilota, &tempo_sul_giro)
!= EOF)
{
tmp = calloc(1, sizeof(BASE) );
tmp -> numero = numero_pilota;
strcpy(tmp -> nome, nome_pilota);
strcpy(tmp -> scuderia, scuderia_pilota);
tmp -> tempo_sul_giro = tempo_sul_giro;
*piloti -> next = tmp;
*piloti = tmp;
}
return;
}
void stampa(list P_testa)
{
list i;
base j;
for(i = P_testa; i != NULL; i = i -> next)
for(j = i -> info.next; j != NULL; j = j -> next)
{
printf("\n%d\t%s:\n", i -> numero_giro, i -> nome_file_giro);
printf("\n%d\t%s\t%s\t%d\n", j -> numero, j -> nome, j -> scuderia, j -> tempo_sul_giro);
}
return;
}