[ Risolto][C] accesso ai file, problema con EOF

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

[ Risolto][C] accesso ai file, problema con EOF

Messaggio da geopardy »

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

Codice: Seleziona tutto

while(1){...}
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:

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' */
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

Codice: Seleziona tutto

while(1){...}
una linea che dica:

Codice: Seleziona tutto

if(<condizione di fine del file> break;)
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 ;)
Ultima modifica di geopardy il sabato 8 marzo 2008, 16:32, modificato 1 volta in totale.
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: [C] accesso ai file, problema con EOF

Messaggio da danilo84 »

Ciao, questo è il ciclo per la terminazione:

Codice: Seleziona tutto

	while ((c = getc(inFile)) != EOF) { 
	printf("CHE STA DENTRO: \n %d",c);
}
Se lo provi ti stampa tutti i caratteri che legge nel file ed esce quando finisce il file. Ovviamente ti da il carattere ascii

Ciao
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

[Risolto] [C] accesso ai file, problema con EOF

Messaggio da geopardy »

GRAZIE!!!
Danilo sei grande!!!
Spero un giorno di poter ricambiare. (b2b)
(good) (rotfl) (good)
Ciao a tutti
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

.

Messaggio da geopardy »

.
Ultima modifica di geopardy il sabato 8 marzo 2008, 17:08, modificato 1 volta in totale.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti