[c] Dove sbaglio in questa fgets ?

di il
9 risposte

[c] Dove sbaglio in questa fgets ?

Buonasera,
non riesco ad implementare un passaggio da file ad array di struct.
La situazione è questa.
Inserisco i dati e se mi limito ad una parola o un intero con fscanf e fprintf tutto fila.
Per rendere le cose più difficili ho voluto fare in modo che in autori si potessero inserire più parole.
Quasi tutto va bene: scrive su file più parole, ma quando devo raccogliere il tutto da file per stampare a video, non funziona.
Questo tutto il malloppo (come al solito c'è qualche variabile e printf in più che uso per "capire"):
#include <stdio.h>
#include <string.h>

typedef struct{
	int codice;
	char titolo[100];
	char autori[100];
	int lenautori;
	int numeroCopieDisponibili;
	int numeroScorta;	
} libreria;

int main()
{
	libreria lib;
	libreria liba[100];
	int uscita=0;
	char appoggio;
	int stampo=0;
	int indice, len, i=0;
	
	/*
	FILE *fp;
	fp=fopen("libreriabuonalettura.txt", "a");
	
	do{

	printf("\n\n");
	printf("Inserisci il CODICE del libro:");
	scanf("%d", &lib.codice);
	
	printf("\n\n");
	printf("Inserisci il TITOLO del libro:");
	scanf("%s", lib.titolo);
	scanf("%c", &appoggio);
	
	printf("\n\n");
	printf("Inserisci il AUTORI del libro:");
	gets(lib.autori); ///////////////////////////////////////////////////////////////////////////////////
	scanf("%c", &appoggio);
	
	lib.lenautori=strlen(lib.autori);
	
	printf("\n\n");
	printf("Inserisci il NUMERO COPIE DISPONIBILI del libro:");
	scanf("%d", &lib.numeroCopieDisponibili);
	
	printf("\n\n");
	printf("Inserisci il NUMERO COPIE SCORTA del libro:");
	scanf("%d", &lib.numeroScorta);

	
	fprintf(fp, "%d %s ", lib.codice, lib.titolo);
	fputs(lib.autori, fp); //////////////////////////////////////////////////////////////////////////////
	fprintf(fp, " %d %d %d ", lib.lenautori, lib.numeroCopieDisponibili, lib.numeroScorta);
	
	printf("%d %s %s %d %d %d ", lib.codice, lib.titolo, lib.autori, lib.lenautori, lib.numeroCopieDisponibili, lib.numeroScorta);
	
	printf("\n\n");
	printf("Vuoi inserire un altro libro? Premi 1 per terminare l'inserimento:");
	scanf("%d", &uscita);
	
	
	
	}while(uscita!=1);
	
	fclose(fp);
	
	*/
	
	printf("Stampo la tabella aggiornata?");
	scanf("%d", &stampo);
	if(stampo==1)
	{	
	
	FILE *fp;
	fp=fopen("libreriabuonalettura.txt", "r");
		do{	

		fscanf(fp,"%d %s ", &liba[i].codice, liba[i].titolo);
		//fscanf(fp,"%s ", liba[i].autori);
		fgets(liba[i].autori,  liba[i].lenautori, fp); //////////////////////////////////////////////////
		fscanf(fp," %d %d %d ", &liba[i].lenautori, &liba[i].numeroCopieDisponibili, &liba[i].numeroScorta);
		i++; indice=i;
		}while(!feof(fp));
		
			
	fclose(fp);

	
	}//FINE IF

			for(i=0; i<indice; i++){
				printf("\n\n %d %s ", liba[i].codice, liba[i].titolo);
				printf("%s ", liba[i].autori);
			printf(" %d %d %d ", liba[i].lenautori, liba[i].numeroCopieDisponibili, liba[i].numeroScorta);
			}

			
return 0;
}//FINE MAIN
Sono sicuro che il problema sia qui: fgets(liba.autori, liba.lenautori, fp);
Mi sono inventato pure questa inutile variabile liba.lenautori per rendere la fgets funzionante ma... niente. Non capisco!

Grazie.

9 Risposte

  • Re: [c] Dove sbaglio in questa fgets ?

    Vabbè ma hai imparato a usare il debugger? A questo punto mi sembra proprio il caso se vuoi diventare autonomo...
  • Re: [c] Dove sbaglio in questa fgets ?

    Facci un esempio di cosa inserisci e cosa ottieni
  • Re: [c] Dove sbaglio in questa fgets ?

    @Weiss no, non so usare il debugger. Voglio imparare quanto prima; tra un paio di giorni ho l'esame, magari mi ci dedico dopo...
    @ Oregon, vien fuori, una formattazione assurda, una marea di 0 0 0, numeri vari e qui e la le informazioni corette:
    Campione di dati copiati dal file:
    1 Inferno Dante Alighieri 15 100 10 2 Gerusalemme Torquato Tasso 14 100 22 3 LingiaggioC Deitel e Deitel 15 123 23
  • Re: [c] Dove sbaglio in questa fgets ?

    Quel lenautori non ha senso, eliminalo.

    Il file deve essere formattato così

    1 Inferno
    Dante Alighieri
    100 10
    2 Gerusalemme
    Torquato Tasso
    100 22
    3 LingiaggioC
    Deitel e Deitel
    123 23

    Il codice del ciclo sarà
    
    		do {
    			fscanf(fp, "%d %s ", &liba[i].codice, liba[i].titolo);
    			fgets(liba[i].autori, 100, fp); 
    			liba[i].autori[strlen(liba[i].autori)-1] = '\0';
    			fscanf(fp, " %d %d ", &liba[i].numeroCopieDisponibili, &liba[i].numeroScorta);
    			i++; indice = i;
    		} while (!feof(fp));
    
  • Re: [c] Dove sbaglio in questa fgets ?

    Oppure ... se il file deve essere formattato su singole linee, allora inserisci PRIMA la lunghezza+1 dell'autore (ma non usare un campo nella struttura), in questo modo

    1 Inferno 16 Dante Alighieri 100 10
    2 Gerusalemme 15 Torquato Tasso 100 22
    3 LingiaggioC 16 Deitel e Deitel 123 23

    e poi dai un'occhiata al codice del ciclo
    
    		FILE *fp;
    		int ll;
    		char fmt[10];
    		fp = fopen("libreriabuonalettura.txt", "r");
    		do {
    			fscanf(fp, "%d %s %d", &liba[i].codice, liba[i].titolo, &ll);
    			sprintf(fmt, "%%%d[^\n]", ll);
    			fscanf(fp, fmt, liba[i].autori);
    			fscanf(fp, "%d %d", &liba[i].numeroCopieDisponibili, &liba[i].numeroScorta);
    			i++; indice = i;
    		} while (!feof(fp));
    [&code]
  • Re: [c] Dove sbaglio in questa fgets ?

    Buongiorno,
    ho continuato ad avere problemi quindi ho fatto un po' di prove. Ho cominciato da
    	printf("\n\n");
    	printf("Inserisci il AUTORI del libro:");
    	gets(lib.autori); 
    	lib.autori[strlen(lib.autori)-1] = '\n';
    Curiosamente liba.autori[strlen(liba.autori)-1] = '\n'; mi troncava le parole: Dante Alighieri diventava Dante Alighier
    Convertendo il tutto in liba.autori[strlen(liba.autori)] = '\n'; a Dante Alighieri aggiungeva altri caratteri strani...
    Quindi partendo da qui ho fatto ancora altre modifiche.

    Ho risolto così:
    Dopo aver raccolto i dati, nel momento della scrittura su file, subito dopo fprintf(fp, "%s", lib.autori); ho aggiunto fprintf(fp, "%c", '\n');
    Quando vado ad eseguire una stampa a video, nel momento in cui leggo da file per caricare l'array di struct, ho aggiunto fscanf(fp, "%[^\n]", liba.autori);

    Funziona perfettamente ma... come vi ho detto voglio capire, non solo superare l'esame (che è tra pochissimi giorni e mi tremano le gambe nonostante l'età e la laurea...)!!!

    Seguitemi nel discorso:
    Io inserisco i dati con gets(lib.autori); che mi risulta inserisca automaticamente anche \0.
    Se io ho avuto bisogno di aggiungere fprintf(fp, "%c", '\n'); allora fprintf non ricopia questo carattere terminatore (che cmq non è la stessa cosa di \n);
    Ecco la necessità di fprintf(fp, "%c", '\n');
    Giusto?
  • Re: [c] Dove sbaglio in questa fgets ?

    Ma tutto quello che ti ho scritto lo hai letto o era trasparente?
  • Re: [c] Dove sbaglio in questa fgets ?

    ho continuato ad avere problemi
    Oregon, l'ho scritto: non mi funzionava! Non so perché!!!
  • Re: [c] Dove sbaglio in questa fgets ?

    Ma COSA non ti funziona? Ti ho suggerito due codici. Tu quale hai usato? Con quale tipo di file dati?
Devi accedere o registrarti per scrivere nel forum
9 risposte