Problema strutture ed fgets [C]

di il
2 risposte

Problema strutture ed fgets [C]

Ciao ragazzi, mi ritrovo sempre a preparare un esame per l'università e sto svolgendo vari compiti, riscontrando un po' di problemi in quei compiti dove si devono usare più strutture in cui qualcuna deve fare riferimento ad un'altra. Dato che trovo pochi esercizi e poca teoria a riguardo chiedo il vostro aiuto, così da chiarirmi alcuni procedimenti.
Posto sempre il testo del compito per essere più chiaro possibile:

Si realizzi un programma in linguaggio C in grado di gestire un sistema di pubblicazioni scientifiche. Il
programma dovrà leggere da un file “pub.txt” le informazioni relative ad alcuni articoli strutturate nel
seguente modo:

TITOLO1 (Titolo dell’articolo 1)
NUM_AUTORI (Numero degli autori dell articolo 1)
AUT1
… (Elenco autori)
AUT N
TITOLO2 (Titolo dell articolo 2)


Inoltre, il programma dovrà leggere da un file “cit.txt” le informazioni relative alle citazioni fatte da ogni
articolo. Tali informazioni saranno strutturate nel seguente modo

TITOLO (Titolo dell’articolo 1)
NUM_CITAZIONI (Numero degli articoli citati dall’articolo 1)
TITOLO1
… (Elenco dei titoli degli articoli citati dall’articolo 1)
TITOLOM
TITOLO (Titolo dell’articolo 2)


Assumendo che:
- gli autori siano indicati utilizzando esclusivamente il cognome
- non ci siano casi di omonimia
- non esistano due titoli uguali
il programma dovrà leggere il file e svolgere le seguenti funzioni:
1. Stampa della lista di articoli di un autore
2. Stampa del numero totale di citazioni ricevute da un autore
3. Stampa del numero di citazioni di un articolo


Sono riuscito a svolgere solo il primo punto fino adesso, non capisco come dopo aver scritto il nome dell'autore, nel secondo punto, mi possa dare il numero di citazioni(che sarebbero i titoli che lui ha contribuito a scrivere) che sono presenti in un'altra struttura.
Poi quando voglio visualizzare la stampa del numero di citazioni del secondo file non mi funziona perfettamente perché fgets non mi va a capo a leggere l'altra linea come fscanf che però qui non posso usare perché devo leggere stringhe con spazi.
Come posso fare?

Ecco il mio codice:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct nomeaut_s{
	char elencoaut[60];
}nomeaut;

typedef struct titolocit_s{
	
	char elencocit[100];
}titolocit;

typedef struct libro_s{
	char titolo[100];
	int num_aut;
	nomeaut autori[60];
}libro;


typedef struct citazioni_s{
	char tit[100];
	int num_cit;
	titolocit cit[100];
}citazioni;


libro elenco[100];
citazioni elenco2[100];

int main(){
	int i, j,n, cont, cont2, index2=0, num=0;
	int index=0, scelta;
	char autore[30], citaz[100];
	
	FILE *fp1, *fp2;
	fp1=fopen("pub.txt","r");
	
	i=0;
	while(!feof(fp1)){fflush(stdin);
	
	
	fgets(elenco[i].titolo, 100, fp1);
	
	fscanf(fp1,"%d", &(elenco[i].num_aut));

	for(cont=0;cont<elenco[i].num_aut;cont++){
	
		
	
		fscanf(fp1,"%s\n",elenco[i].autori[cont].elencoaut);
		

	}
		i++;
		index++;
}

	
fclose(fp1);

	fp2=fopen("cit.txt","r");
	
	j=0;
	while(!feof(fp2)){fflush(stdin);
	
	
	fgets(elenco2[j].tit, 100, fp2);
	
	fscanf(fp2,"%d", &(elenco2[j].num_cit));

	for(cont2=0;cont2<elenco2[j].num_cit;cont2++){
	
		
	
		fgets(elenco2[j].cit[cont2].elencocit, 100 ,fp2);
		fgets(elenco2[j].cit[cont2].elencocit, 100 ,fp2);
		

	}
		j++;
		index2++;
}
fclose(fp2);



do{
	printf("1-Visualizza file pub.txt\n");
	printf("2-Visualizza file cit.txt\n");
	printf("3-Stampa lista articoli di un autore\n");
	printf("4-Stampa il numero di citazioni ricevute da un autore\n");
	printf("5-Stampa numero di citazioni di un articolo\n");
	printf("0-Esci\n");
	
	scanf("%d", &scelta);
	switch(scelta){
		
		case 1:
			printf("Stampa del file pub.txt\n\n");
			for(i=0;i<index;i++){
				printf("Titolo:%s",elenco[i].titolo);
				printf("Numero di autori: %d\n", elenco[i].num_aut);
					for(cont=0; cont<elenco[i].num_aut;cont++){
						printf("Cognome autore:%s\n", elenco[i].autori[cont].elencoaut);
					}
			}	
			printf("\n\n");
			break;
		case 2:
			printf("Stampa del file cit.txt\n\n");
			for(j=0;j<index2;j++){
				printf("Titolo:%s",elenco2[j].tit);
				printf("Numero di citazioni: %d\n", elenco2[j].num_cit);
					for(cont2=0; cont2<elenco2[j].num_cit;cont2++){
						printf("Citazione:%s", elenco2[j].cit[cont2].elencocit);
						num++;
					}
			}	
			printf("\n\n");
			break;
		case 3:
			printf("\nStampa lista articoli di un autore\n\n");
			printf("Scrivi cognome autore:");
			scanf("%s", autore);
			for(i=0;i<index;i++){
				for(cont=0; cont<elenco[i].num_aut;cont++){
					if(strcmp(elenco[i].autori[cont].elencoaut, autore)==0)
						printf("Titolo:%s\n", elenco[i].titolo);
				}			
			}	
			printf("\n\n");
			break;
		case 4:
			break;
		case 5:
			break;
		default:printf("Hai inserito una scelta non valida");
			break;
	}
}while(scelta!=0);

}

2 Risposte

  • Re: Problema strutture ed fgets [C]

    Esempio dei file:

    FILE pub.txt

    On utilization of contributory storage in desktop grids
    3
    Miller
    Butt
    Huffman
    Reliability of XOR- based erasure codes on heterogeneous devices
    3
    Greenan
    Miller
    Wylie
    Analysis of long-running replicated systems
    2
    Huffman
    Pasquale
    Mirrored disk organization reliability analysis
    3
    Pasquale
    Davies
    Huffman

    FILE cit.txt

    On utilization of contributory storage in desktop grids
    2
    Reliability of XOR- based erasure codes on heterogeneous devices
    Mirrored disk organization reliability analysis
    Reliability of XOR- based erasure codes on heterogeneous devices
    3
    On utilization of contributory storage in desktop grids
    Analysis of long-running replicated systems
    Mirrored disk organization reliability analysis
    Analysis of long-running replicated systems
    2
    Mirrored disk organization reliability analysis
    Reliability of XOR- based erasure codes on heterogeneous devices

    Esempio esecuzione programma:

    Stampa_lista Miller
    > On utilization of contributory storage in desktop grids
    > Reliability of XOR- based erasure codes on heterogeneous devices
    Stampa_num_citazioni Miller
    > 3
    Stampa_num_citazioni Reliability of XOR- based erasure codes on heterogeneous devices
    > 2
  • Re: Problema strutture ed fgets [C]

    Per quanto riguarda fgets ho risolto mancava un \n nella lettura con fscanf del numero di citazioni subito prima del for.
Devi accedere o registrarti per scrivere nel forum
2 risposte