Fgets

di il
18 risposte

Fgets

Ciao ragazzi,
Ho un problema, riguardo il programma sottostante. Non riesco a capire il perchè la prima istruzione di fgets non la calcola proprio il compilatore, al contrario della seconda chiamata .

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"scelta.h"
#include"struct.h"

void inserisci(){
	char cantante[MAX];
	char titolo[MAX];
	float tempo;
	FILE *fptr;
	if((fptr=fopen("mp3.txt","a"))==NULL){
		printf("errore apertura file mp3.txt\n");
		exit(EXIT_FAILURE);
	}
	else{
		printf("Artista,Titolo,Durata\n");
		
		printf("inserisci l'artista\n");
		fgets(cantante,MAX,stdin);
		cantante[strlen(cantante)-1]=0;
		fprintf(fptr,"%s,",cantante);
		
		printf("inserisci il titolo\n");
		fgets(titolo,MAX,stdin);
		titolo[strlen(titolo)-1]=0;
		fprintf(fptr,"%s,",titolo);

		printf("inserisci la durata\n");
		scanf("%f",&tempo);
		fprintf(fptr,"%.2f\n",tempo);
	}
}

Grazie in anticipo.

18 Risposte

  • Re: Fgets

    A me sembra che funzioni!

    Che errore riscontri?
  • Re: Fgets

    Quando compilo il programma in output mi viene inviato:
    Artista,Titolo,Durata
    Inserisci l' artista //salta fgets
    Inserisci il titolo //richiede l'input da tastiera
  • Re: Fgets

    L'ho apperna provato io e mi funziona.

    Porbabilmente il problema è da qualche altra parte.

    Il codice di prova è questo.
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define MAX 100
    
    void inserisci();
    
    
    int main(){
        inserisci();
        return 0;
    }
    
    
    void inserisci(){
       char cantante[MAX];
       char titolo[MAX];
       float tempo;
       FILE *fptr;
       if((fptr=fopen("mp3.txt","a"))==NULL){
          printf("errore apertura file mp3.txt\n");
          exit(EXIT_FAILURE);
       }
       else{
          printf("Artista,Titolo,Durata\n");
    
          printf("inserisci l'artista\n");
          fgets(cantante,MAX,stdin);
          cantante[strlen(cantante)-1]=0;
          fprintf(fptr,"%s,",cantante);
    
          printf("inserisci il titolo\n");
          fgets(titolo,MAX,stdin);
          titolo[strlen(titolo)-1]=0;
          fprintf(fptr,"%s,",titolo);
    
          printf("inserisci la durata\n");
          scanf("%f",&tempo);
          fprintf(fptr,"%.2f\n",tempo);
       }
    }
    
    
  • Re: Fgets

    Sicuramente il problema è la scanf che lascia dentro al buffer uno '\n', esegui una funzione di purge o se sei sotto windows (anche se non si dovrebbe fare ) una fflush(stdin) dopo ogni chiamata alla scanf.
    In alternativa preleva ogni input con la fgets e poi converti il valore in quello desiderato.
  • Re: Fgets

    Il codice che mi hai inviato anche a me funziona.
    Ho provato a cercare l'errore negli altri file ma non riesco proprio a stanarlo.
    
    
    main.c 
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"struct.h"
    #include"scelta.h"
    int main(){
    	Rubricaptr testa=NULL;
    	int decisione;
    	printf("Premi 1 per aggiungere una nuova canzone al tuo mp3, premi 2 per eliminare una canzone al tuo mp3, premi 3 per stampare il contenuto\n");
    	scanf("%d",&decisione);
    	switch(decisione){
    		case 1:
    			inserisci();
    			break;
    	}
    	
    
    }
    
    
    struct.h
    
    #ifndef STRUCT_H
    #define STRUCT_H
    #define MAX 100
    struct rubrica{
    	struct rubrica *succ;
    	char artista[MAX];
    	char canzone[MAX];
    	float durata;
    };
    
    
    typedef struct rubrica Rubrica;
    typedef Rubrica *Rubricaptr;
    #endif
    
    
    scelta.h
    
    
    #ifndef SCELTA_H
    #define SCELTA_H
    
    void inserisci();
    
    #endif
    
    
    scelta.c è il codice inviato precedentemente.
  • Re: Fgets

    Ho provato ad inserire dopo ogni scanf fflush(stdin) ma il risultato non cambia
  • Re: Fgets

    Anche dopo la scanf del menu?
  • Re: Fgets

    L'ho inserita dopo la scanf("%d",&decisione); e dopo scanf("%d",&tempo);
  • Re: Fgets

    Se posti l'attuale codice modificato e compilabile, si controlla.
  • Re: Fgets

    Metti uno fflush(stdout) prima di ogni input, sia fgets che scanf.
  • Re: Fgets

    
    main .c
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"struct.h"
    #include"scelta.h"
    int main(){
    	Rubricaptr testa=NULL;
    	int decisione;
    	printf("Premi 1 per aggiungere una nuova canzone al tuo mp3, premi 2 per eliminare una canzone al tuo mp3, premi 3 per stampare il contenuto\n");
    	scanf("%d",&decisione);
    	fflush(stdin);
    	switch(decisione){
    		case 1:
    			inserisci();
    			break;
    		/*case 2:
    			elimina(&testa);
    			break;
    		*/
    
    	}
    	
    }
    
    scelta.c 
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"scelta.h"
    #include"struct.h"
    
    void inserisci(){
    	char cantante[MAX];
    	char titolo[MAX];
    	float tempo;
    	FILE *fptr;
    	if((fptr=fopen("mp3.txt","a"))==NULL){
    		printf("errore apertura file mp3.txt\n");
    		exit(EXIT_FAILURE);
    	}
    	else{
    		printf("Artista,Titolo,Durata\n");
    		
    		printf("inserisci l'artista\n");
    		fgets(cantante,MAX,stdin);
    		cantante[strlen(cantante)-1]=0;
    		fprintf(fptr,"%s,",cantante);
    		
    		printf("inserisci il titolo\n");
    		fgets(titolo,MAX,stdin);
    		titolo[strlen(titolo)-1]=0;
    		fprintf(fptr,"%s,",titolo);
    
    		printf("inserisci la durata\n");
    		scanf("%f",&tempo);
    		fflush(stdin);
    		fprintf(fptr,"%.2f\n",tempo);
    	}
    	
    }
    
    scelta.h
    
    #ifndef SCELTA_H
    #define SCELTA_H
    
    void inserisci();
    //void elimina(Rubricaptr *testa);
    #endif
    
    struct.h
    
    #ifndef STRUCT_H
    #define STRUCT_H
    #define MAX 100
    struct rubrica{
    	struct rubrica *succ;
    	char artista[MAX];
    	char canzone[MAX];
    	float durata;
    };
    
    
    typedef struct rubrica Rubrica;
    typedef Rubrica *Rubricaptr;
    #endif
    
    come si può notare sono programmati in file differenti
  • Re: Fgets

    Ma tu usi visual c++ ?
  • Re: Fgets

    No utilizzo il C
  • Re: Fgets

    Intendo dire quale compilatore su quale sistema operativo ...
Devi accedere o registrarti per scrivere nel forum
18 risposte