[c] FILE, struct, funzioni - ricerca con associazione

di il
9 risposte

[c] FILE, struct, funzioni - ricerca con associazione

Buonasera,
sto svolgendo un esercizio con file, struct e funzioni e mi sono bloccato.
Sto gestendo una biblioteca. Inserisco in una struct nome e cognome del richiedente, autore e titolo e codice dell'argomento compreso tra 1 e 25.
Faccio un po' di cose e va tutto bene.
Non riesco a stampare la lista dei libri richiesti per argomento. Ho provato con un ciclo e un if innestato ma non funziona. Sicuramente sbaglio più di una cosa a livello concettuale. Inolto la funzione incriminata:
void funzioneArgomentoPerTesto()
{// INIZIO BLOCCO FUNZIONE
	FILE* fp_funzione;
	fp_funzione=fopen("schedalibro.txt","r");
	scheda s1_funzione;
	int res=0;
	int i=0;
	int y=0;
	int k=0;
	int j[26]={0};
	
	

	 if (!fp_funzione) printf("Problemi nella apertura file (funzioneStampaTuttiRecord)");
	 else {
		for(i=1; i<30; i++){ 
		printf("\n\nArgomento %d", i);
	 do{ //WHILE
	 
	 res=fscanf(fp_funzione, "%s", s1_funzione.nome); fscanf(fp_funzione, "%s", s1_funzione.cognome); fscanf(fp_funzione, "%s", s1_funzione.autore); fscanf(fp_funzione, "%s", s1_funzione.titolo);  fscanf(fp_funzione, "%d", &s1_funzione.arg);
	 if(!feof(fp_funzione)){  if(s1_funzione.arg==i);  printf("%s ""\n", s1_funzione.titolo);   } 


	 } while(!feof(fp_funzione));
	 fseek(fp_funzione, 0L, SEEK_SET);
	 	 } //FINE FOR
	 		 }//FINE ELSA
	 		 
	printf("\n");

	
		 fclose(fp_funzione);
		 
}// FINE BLOCCO FUNZIONE
Questo il main:
#include <stdio.h>

void funzioneStampaTuttiRecord();
void funzioneNumeroTotaleLettori();
void funzioneListaLibriRichiestiPerArgomento();
void funzioneArgomentoPerTesto();

typedef struct{
char nome[20];
char cognome[20];
char autore [20];
char titolo[20];
int arg;
}scheda;


main()
{
	scheda s1;
	int i;
	char appoggio;
	char uscita;

	FILE *fp;
	fp=fopen("schedalibro.txt","a");

	do{
	printf("Inserire il NOME del RCHIEDENTE: ");
	scanf("%s", s1.nome);

	printf("Inserire il COGNOME del RCHIEDENTE: ");
	scanf("%s", s1.cognome);

	printf("Inserire l'AUTORE richiesto: ");
	scanf("%s", s1.autore);

	printf("Inserire il TITOLO richiesto: ");
	scanf("%s", s1.titolo);

	//fflush(stdin);
	printf("Inserire ARGOMENTO 1-25: ");
	scanf("%d", &s1.arg);
	fflush(stdin);

	 if (fp==NULL) printf("Problemi nella apertura file");
	 else { fprintf(fp, "%s ", s1.nome); fprintf(fp, "%s ", s1.cognome); fprintf(fp, "%s ", s1.autore); fprintf(fp, "%s ", s1.titolo);  fprintf(fp, "%d ", s1.arg);
	 }

	 printf("Uscire? Premi u per uscire qualsiasi altro carattere per continuare l'inserimento");
	 	scanf("%c", &uscita);

	} while(uscita!='u');

	 fclose(fp);


	 	// printf("%s", s1.nome); printf("%s", s1.cognome); printf("%s", s1.autore); printf("%s", s1.titolo);  printf("%d", s1.arg);

	//funzioneStampaTuttiRecord();  //INVOCAZIONE FUNZIONE
	//funzioneNumeroTotaleLettori(); //INVOCAZIONE FUNZIONE
	//funzioneListaLibriRichiestiPerArgomento(); //INVOCAZIONE FUNZIONE
	funzioneArgomentoPerTesto(); //INVOCAZIONE FUNZIONE
	
		//funzioneNumeroTotaleLettori(); //INVOCAZIONE FUNZIONE

		// printf("%s", s1.nome); printf("%s", s1.cognome); printf("%s", s1.autore); printf("%s", s1.titolo);  printf("%d", s1.arg);

	printf("\n\n");
}
Grazie

9 Risposte

  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Fflush(stdin) non si usa perché genera comportamento indefinito.

    Comunque hai messo troppa carne al fuoco. Fatti un array di 6-8 schede e inizializzalo tu a mano all'inizio del main, poi prova a ordinarlo per argomento.

    Quando hai risolto questo, prova a fare un altro programma che faccia lettura/scrittura su file di un array di schede.

    Quando funziona tutto, prova a mettere tutto insieme
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Ciao,
    se ho capito bene mi stai indicando di creare un array di struct: nel mio caso s1_funzione[INDICE].
    Correggimi se sbaglio!
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Si
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Non ci riesco ! Ma è perché non ho capito a livello concettuale!!!
    Questa è l'ultima delle mie prove!
    void funzioneArgomentoPerTesto()
    {// INIZIO BLOCCO FUNZIONE
    	FILE* fp_funzione;
    	fp_funzione=fopen("schedalibro.txt","r");
    	scheda s1_funzione[27];
    	int res=0;
    	int q, m, i=0;
    	int y=0;
    	int k=0;
    	int j[27]={0};
    
    
    
    	 if (!fp_funzione) printf("Problemi nella apertura file (funzioneStampaTuttiRecord)");
    	 else {
    		for(i=1; i<30; i++){
    
    	 do{ //WHILE
    
    	 res=fscanf(fp_funzione, "%s", s1_funzione[i].nome); fscanf(fp_funzione, "%s", s1_funzione[i].cognome); fscanf(fp_funzione, "%s", s1_funzione[i].autore); fscanf(fp_funzione, "%s", s1_funzione[i].titolo);  fscanf(fp_funzione, "%d", &s1_funzione[i].arg);
    	 if(!feof(fp_funzione)){  i++;  }
    
    
    	 } while(!feof(fp_funzione));
    
    	 	 } //FINE FOR
    	 		 }//FINE ELSA
    
    	printf("\n");
    
    	        for(m=0; m<27; m++) {printf("\n\nArgomento %d", m);
                for(q=0; q<27; q++){
    		    if(s1_funzione[q].arg==q);  printf("%s ""\n", s1_funzione[q].titolo);} }//
    
    		 fclose(fp_funzione);
    
    
    }// FINE BLOCCO FUNZIONE
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Non mi va nemmeno con questo:
    void funzioneArgomentoPerTesto()
    {// INIZIO BLOCCO FUNZIONE
    	FILE* fp_funzione;
    	fp_funzione=fopen("schedalibro.txt","r");
    	scheda s1_funzione[27];
    	int res=0;
    	int i=0;
    	int m=0;
    	int q=0;
    	int y=0;
    	int k=0;
    	int j[27]={0};
    
    
    
    	 if (!fp_funzione) printf("Problemi nella apertura file (funzioneStampaTuttiRecord)");
    	 else {
    
    	 do{ //WHILE
            i=0;
    	 res=fscanf(fp_funzione, "%s", s1_funzione[i].nome); fscanf(fp_funzione, "%s", s1_funzione[i].cognome); fscanf(fp_funzione, "%s", s1_funzione[i].autore); fscanf(fp_funzione, "%s", s1_funzione[i].titolo);  fscanf(fp_funzione, "%d", &s1_funzione[i].arg);
    	 if(!feof(fp_funzione)){  i++;  }
    
    
    	 } while(!feof(fp_funzione));
    
    	 		 }//FINE ELSA
    
    	printf("\n");
    
    	        for(m=1; m<30; m++) {printf("\n\nArgomento %d", m);
                for(q=1; q<30; q++){
    		    if(s1_funzione[q].arg==m);  printf("%s ", s1_funzione[q].titolo);} }//
    
    		 fclose(fp_funzione);
    
    
    }// FINE BLOCCO FUNZIONE
    p.s. 30 è perché ho una trentina di libri...
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Ti avevo detto di mettere un attimo da parte i file e di risolvere una cosa alla volta...
    
    #include <stdio.h>
    #include <string.h>
    
    [...]
        scheda s[30];
        
        strcpy(s[0].nome, "Tizio");
        strcpy(s[0].cognome, "Caio");
        strcpy(s[0].autore, "Jack London");
        strcpy(s[0].titolo, "Zanna Bianca");
        s[0].arg = 1;
        strcpy(s[1].nome, "Mario");
        strcpy(s[1].cognome, "Rossi");
        strcpy(s[1].autore, "Philip Dick");
        strcpy(s[1].titolo, "Ubik");
        s[1].arg = 2;
    [...]
    
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Grazie
    Due domande:
    a) strcpy(s[0].nome, "Tizio"); è un escamotage che, utilizzando la funzione di copia, effettua un'assegnazione ad un array di char? (non potendo fare un'assegnazione come la si fa con una variabile semplice: int a; a= 2;)

    B) Ho risolto così (con più di un dubbio a cominciare dal fatto che io imposto un arraiy di struct a 100 in maniera discrezionale...)
     
    	void funzioneArgomentoPerTesto()
    {// INIZIO BLOCCO FUNZIONE
    	FILE* fp_funzione;
    	fp_funzione=fopen("schedalibro.txt","r");
    	scheda s1_funzione[100];
    	int i=0;
    	int y=0;
    	int k=0;
    
    
    	 if (!fp_funzione) printf("Problemi nella apertura file (funzioneStampaTuttiRecord)");
    	 else {
    	 do{ //WHILE
    	 //gets(fp_funzione);
    	 fscanf(fp_funzione, "%s", s1_funzione[i].nome); fscanf(fp_funzione, "%s", s1_funzione[i].cognome); fscanf(fp_funzione, "%s", s1_funzione[i].autore); fscanf(fp_funzione, "%s", s1_funzione[i].titolo);  fscanf(fp_funzione, "%d", &s1_funzione[i].arg);
    	 //puts(fp_funzione);
        if(!feof(fp_funzione)){i++; }
    	 } while(!feof(fp_funzione));
    	 		 }
        
            for(y=1;y<26; y++){
        	printf("\nArgomento %d: ", y);
        for(k=0;k<25; k++)
        if(s1_funzione[k].arg==y) printf("%s ", s1_funzione[k].titolo);}
    
    	printf("\n");
    
    	fclose(fp_funzione);
    	}// FINE BLOCCO
    
    
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    A) non è un escamotage, è una funzione prevista dallo standard

    B) ok, hai voluto risolvere tutto assieme
    Bene, prova ad ottimizzare quello che funziona, allora. Fai un fscanf unico, i++ senza if, sistema la logica su k...
    Per il buffer da 100, puoi anche scriverlo da 10000, siamo nel 2020 e le memorie RAM sono fatte da Gigabyte... ma volendo puoi scrivere meglio anche da questo punto di vista
  • Re: [c] FILE, struct, funzioni - ricerca con associazione

    Innazitutto ancora grazie. Sto facendo tesoro dei tuoi consigli così come dei consigli ricevuti dagli altri (sono bastate poche parole di oregon sui puntatori per farmi capire tante cose).
    Domani, dopo il lavoro (e non solo...) mi metto di nuovo all'opera provando a sviluppare i tuoi spunti.

    Per quantoi riguarada strcpy; sì, so che è una funzione dello standard. Solo che il modo in cui l'hai usata tu mi ha colpito. E' geniale.
    Se non sbaglio (e spero tanto di no!!!), non si può assegnare una stringa ad un'array (se non in fase di definizione). Che io sappia, a parte la fase di definizione in cui posso scrivere char string[6]="pippo"; si può assegnare una stringa ad un array come char[6] solo con un ciclo for (carattere per carattere).
    Ecco perché l'uso del strcpy in quel modo mi sembra geniale.

    Ancora grazie e a domani.
Devi accedere o registrarti per scrivere nel forum
9 risposte