Funzione scanf() che viene saltata

di il
10 risposte

Funzione scanf() che viene saltata

Ciao mi sono appena iscritto e vi saluto tutti.
Sono alle prese con il C e avrei bisogno, se possibili, di un aiutino.
Sto studiando la gestione dei files e creando quindi i primi semplici programmini.
Ho una funzione scanf() che viene saltata a piè pari dopo il richiamo di una funzione.
Mi spiego meglio (e copio e incollo anche il codice in questione): la prima invocazione di scanf va bene ma, dopo aver richiamato una funzione che chiama al suo interno una fscanf, la chiamata successiva viene saltata completamente!
Ho letto da diverse parti le tecniche per lo svuotamento del buffer di input ma non hanno funzionato.
Il problema sembra sorgere per l'inserimento di un EOF (tramite ctrl+Z) all'interno della funzione.
Insomma non mi raccapezzo più!!!


#include <stdio.h>

int creaFileConti(char *fileName);

struct conto 
{
	int id;
	char cognome[30], 
	     nome[30];
	double saldo;
};

typedef struct conto Conto;

int main(void)
{

	int (*menu[2])(char *param);
	menu[0] = creaFileConti;
	menu[1] = leggiFileConti;

	printf("1 - crea file\n2 - leggi file\n3 - fine\n ? ");
	int scelta;
	char fileName[20];
 	scanf("%d%s", &scelta, fileName);

	while(scelta!=3){
		menu[scelta-1](fileName);
		printf("1 - crea file\n2 - leggi file\n3 - fine\n ? ");
		scanf("%d%s", &scelta, fileName);
	}

	return 0;
}

int creaFileConti(char *fileName)
{
	FILE *cfPtr;

	cfPtr = fopen(fileName, "w");

	if(cfPtr==NULL)
	{
		printf("Problemi ad aprire il file\n");	
		return 0;	
	} 
	else 
	{
		printf("Inserisci Id Cognome Nome Saldo\n ? ");
		Conto nuovoConto;
		fscanf(stdin, 
                          "%d%s%s%lf", 
                          &nuovoConto.id, 
                          nuovoConto.cognome, 
                          nuovoConto.nome, 
                          &nuovoConto.saldo);
		
		while(!feof(stdin)){
			fprintf(cfPtr, 
                                   "%d %s %s %f\n", 
                                   nuovoConto.id, 
                                   nuovoConto.cognome, 
                                   nuovoConto.nome, 
                                   nuovoConto.saldo);
			printf("Inserisci Id Cognome Nome Saldo\n ? ");
			fscanf(stdin, 
                                  "%d%s%s%lf", 
                                  &nuovoConto.id, 
                                  nuovoConto.cognome, 
                                  nuovoConto.nome, 
                                  &nuovoConto.saldo);
		}

		fclose(cfPtr);

		return 1;
	}
}


10 Risposte

  • Re: Funzione scanf() che viene saltata

    Il fatto di usare una sola scanf o fscanf per l'input di più campi non è positiva.

    Per il menu, ad esempio

    scanf("%d%s", &scelta, fileName);

    ogni volta è necessario indicare anche il nome del file.
  • Re: Funzione scanf() che viene saltata

    L'ho impostato così perchè quel vettore di puntatori a funzione farà riferimento a una serie di funzioni per la gestione di file che saranno tutte nella forma "int nomeFunzione (char *nomeFile)" poichè, essendo funzioni per la scrittura o lettura di file, in ogni caso bisogna indicare il file che si vuole elaborare.
  • Re: Funzione scanf() che viene saltata

    E' scomodissimo.

    Se vuoi terminare il lavoro con 3 devi comunque indicare il nome del file.

    Che senso ha?
  • Re: Funzione scanf() che viene saltata

    Non ci badare...il codice postato è assolutamente temporaneo! La cosa che mi preme adesso è capire come mai la scanf() nel ciclo while (nel main) non funziona, viene saltata del tutto come se non esistesse. Sicuramente c'entra qualcosa il fatto che nella funzione creaFileConti() all'ultima invocazione la fscanf() riceve un EOF ma non riesco a capire come risolvere il problema
  • Re: Funzione scanf() che viene saltata

    Il fatto è che quell'uso di scanf e fscanf potrebbe essere la causa del problema che hai.

    Comunque, non sono riuscito ad avere il malfunzionamento. Tu cosa inserisci esattamente?
    Come esegui il programma? Magari una schermata ...
  • Re: Funzione scanf() che viene saltata

    Alla prima scanf inserisco "1 nomefile.txt".
    Il programma richiama la funzione creaFileConti e quindi mi chiede di inserire i dati.
    Inserisco "100 cognome nome saldo", poi "200 cognome nome saldo", ecc.
    Alla fine inserisco un ctrl+Z.
    A questo punto la funzione restituisce il comando a main e a quel punto, con la scanf nel while, il main dovrebbe chiedermi quale altra operazione voglio effettuare. Invece la scanf viene eseguita (l'ho visto in debug) ma non accade nulla e così rientra nel ciclo while richiamando di nuovo la funzione creaFileConti.
  • Re: Funzione scanf() che viene saltata

    Che ambiente/compilatore usi?

    Io inserisco
    1 nomefile.txt

    e poi

    100 cognome nome 1
    200 cognome nome 2

    e dopo

    Ctrl+z

    e torna all'input del menu senza problemi.
  • Re: Funzione scanf() che viene saltata

    Processore intel x64
    windows 8.1
    Pelles C
  • Re: Funzione scanf() che viene saltata

    Ho provato con VC++ e non ho riprodotto il problema.

    Prova con un altro compilatore e/o utilizza un modo diverso di completare il ciclo (ad esempio con id = 0)
  • Re: Funzione scanf() che viene saltata

    Pazzesco! Hai ragione con vs2013 non presenta l'errore!
    I misteri della compilazione!
Devi accedere o registrarti per scrivere nel forum
10 risposte