[ Risolto][C] accesso ai file, problema con EOF
Inviato: giovedì 6 marzo 2008, 20:04
Ciao a tutti, sto preparando degli esercizi su accesso a file in linguaggio C per l'esame di 'Introduzione alla programmazione'. Il mio problema è che nel codice qui sotto non riesco a identificare la condizione che mi permetta di uscire correttamente dal loop infinito determinato dalla nel ciclo di assegnazione dell'output. Si tratta di un programmino che legge un file ASCII dato come argomento da linea di comando e ne visualizza il contenuto. Ecco il codice:
Purtroppo nel mio testo di riferimento l'argomento non viene affrontato in maniera specifica, e su internet è come cercare un ago in un pagliaio. Ho provato a creare delle linee di debug che stampano a video i valori dei vari puntatori ma non vedo niente che identifichi la fine del file. La mia idea consiste nell'inserire all'interno della una linea che dica: in modo da uscire così dal loop.
Per favore qualcuno mi può dare un suggerimento? E' questo il motivo per cui ottengo 'segmentation fault' benchè l'output venga presentato correttamente?
Grazie a tutti per l'attenzione e ancor più grazie a coloro i quali mi daranno la soluzione
Codice: Seleziona tutto
while(1){...}Codice: Seleziona tutto
/* disp.c */
/* Visualizzazione del file passato come argomento da linea di comando */
/*
TIPO FILE: ASCII
I campi sono separati da ',' le struct da '\n'.
I campi sono lunghi al massimo MAXLENGHT.
Il nome del file da creare è dato da command line.
*/
#define MAXLENGHT 30
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
FILE *inFile; /*puntatore a file */
char str1[MAXLENGHT];
char str2[MAXLENGHT];
char str3[MAXLENGHT];
int i ,c;
struct tscheda{ /* definisce la struttura per i record */
char *nome;
int anno_nascita;
char *citta;
char *stato;
}myrecord; /* istanzia la variabile di tipo tscheda */
if (argc != 2) { /* gestisce la situazione in cui non venga passato nessun argomento (o troppi argomenti) */
printf("Uso: %s nomefile\n", argv[0]);
exit (1);
}
inFile = fopen (argv[1], "r"); /* ottiene il puntatore al file */
if (inFile == NULL) { /* controllo esistenza del file passato come argomento */
printf("%s: File Inesistente!\n", argv[1]);
exit(1); /* esce con disprezzo ;) */
}
while (1) { /******** Questo è il ciclo continuo che voglio interrompere raggiunta la fine del file, MA COME???? *****/
i = 0;
while ((c = getc(inFile)) != ',')
str1[i++] = c;
str1[i] = '\0';
myrecord.nome = str1;
fscanf(inFile, "%d", &myrecord.anno_nascita);
getc(inFile); /* virgola */
i = 0;
while ((c = getc(inFile)) != ',')
str2[i++] = c;
str2[i] = '\0';
myrecord.citta = str2;
i = 0;
while ((c = getc(inFile)) != '\n')
str3[i++] = c;
str3[i] = '\0';
myrecord.stato = str3;
printf("%s %d %s %s\n", myrecord.nome, myrecord.anno_nascita, myrecord.citta, myrecord.stato);
}
printf("fuori\n"); /* il flusso del programma (ovviamente e purtroppo) non arriva mai qui */
return(fclose(inFile));
} /* il programma produce l'output corretto ma non esce correttamente con fclose() - ottengo 'segmentation fault' */Codice: Seleziona tutto
while(1){...}Codice: Seleziona tutto
if(<condizione di fine del file> break;)Per favore qualcuno mi può dare un suggerimento? E' questo il motivo per cui ottengo 'segmentation fault' benchè l'output venga presentato correttamente?
Grazie a tutti per l'attenzione e ancor più grazie a coloro i quali mi daranno la soluzione