Esercizio gestione oggetti di un negozio con FILE

di il
3 risposte

Esercizio gestione oggetti di un negozio con FILE

Ciao a tutti. Ho qualche problema con un programmino il cui compito è quello di gestire un file contenente le informazioni di alcuni oggetti (nello specifico il numero del record, il nome, la quantita di oggetti e il prezzo). Per gestione intendo: la visualizzazione del contenuto del file. Tale file, per essere precisi, non deve esistere in memoria, ma deve essere creato al momento dell'inserimento del primo elemento. I problemi che ho sono 3:

1 - Quando vado ad inserire il primo elemento, apparentemente il tutto funzione correttamente creandomi il file, tuttavia quando vado per accedervi, mi dice che il tipo di file non è supportata (non credo sia dovuto al fatto che utilizzo Ubuntu 12.10)

2 - Non riesco a realizzare la funzione che visualizza il contenuto del file. Se il file è vuoto mi deve restituire un messaggio a video dove indica appunto l'assenza di elementi nel file, altrimenti il contenuto stesso. Da notare una cosa: la specifica dell'esercizio dice che il numero del record indica anche la posizione dell'elemento all'interno del file (mi sono dimenticato di dirvi che il file può contenere massimo 100 elementi).

3 - nella funzione modifica mi dà errore di segmentazione ma non riesco a trovare dove ho sbagliato. Mi potete dare un indizio?

Ecco il codice che ho scritto

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

typedef struct {
       
        int numRecord;
		char nome[20];
		int quantita;
		float prezzo; 
		int cancellato;  }attrezzo;

attrezzo a[100];
attrezzo a1;

FILE *fp;

void Elenca();
void Inserisci();
void Ricerca();
void Modifica();
void Cancella();

int main() {
	
	int scelta;
    
    do {
		
		printf("GESTIONE ARCHIVIO ATTREZZI");
		printf("\n1. Visualizza il contenuto del file");
		printf("\n2. Inserisci un record");
		printf("\n3. Ricerca uno attrezzo");
		printf("\n4. Modifica i dati di un attrezzo");
		printf("\n5. Cancella un record");
		printf("\nFa la tua scelta: ");
		
		scanf("%d", &scelta);
		
		if ((scelta > 5) || (scelta < 1))
			
			printf("\nScelta non valida. Riprova!");
			
		switch (scelta)  {
			
			    case 1: Elenca(); break;
			
				case 2: Inserisci(); break;
				
				case 3: Ricerca(); break;
				
				case 4: Modifica(); break;
				
				case 5: Cancella(); break; }   

     }while (scelta != 6);

system("PAUSE");

return 0;

}

void Elenca() {
	
	... //devo farla

/* inserimento di un record */

void Inserisci()  {
	
	fp = fopen("Hardware", "w");
 	
	printf("\nINSERISCI NUOVO STRUMENTO:\n");
	
	printf("numero record ");
	scanf("%d", &a1.numRecord);
	
	printf("nome: ");
    scanf("%s", a1.nome);

	printf("quantita: ");
	scanf("%d", &a1.quantita);

	printf("prezzo: ");
	scanf("%f", &a1.prezzo);

	a1.cancellato = 0;
       
    fwrite(&a1, sizeof(attrezzo), 1, fp);
    
    fclose(fp);

    printf("\nInserimento effettuato!\n");

}

/* ricerca di un record */

void Ricerca() {
	
	char nome_cercato[20]; 
	
	int trovato = 0;

    if ((fp = fopen("Hardware", "r")) == NULL)
    
		printf("\nErrore. L'archivio non esiste!\n");
	
	else  {
		
		printf("\nattrezzo da cercare: ");
		scanf("%s", nome_cercato);

		while ((!trovato) && (!feof(fp))){
		
		fread(&a1, sizeof(attrezzo), 1, fp);
		
		if (!strcmp(a1.nome, nome_cercato) && (a1.cancellato == 0)) {
		
				trovato = 1;
				
				printf("\nNumero Record: %d", a1.numRecord);
				printf("\nNome: %s", a1.nome);
				printf("\nQuantita: %d", a1.quantita);
				printf("\nPrezzo: %.2f\n", a1.prezzo);
				
             }
         
         }
          
        fclose(fp);
         
        if (!trovato)
				
				printf("\nIl record cercato non esiste!\n");
		
		}
		
		system("pause");
	
	}
/* modifica di un record */

void Modifica() {
	
	char nome_cercato[20];
	
	int trovato = 0;
	
	if ((fp = fopen("Hardware", "r+")) == NULL)
	
		printf("\nErrore. L'archivio non esiste!\n");
	
	else {
		
		printf("\nNome da modificare: ");
		scanf("%s", nome_cercato);
		
		while ((!trovato) && (!feof(fp)))  {
			
			fread(&a1, sizeof(attrezzo), 1, fp);
			
			if (!strcmp(a1.nome, nome_cercato) && (!a1.cancellato)) {
					
					trovato = 1;
					printf("\n\n");
			
			
			printf("Nuova quantita: ");
			scanf("%d", &a1.quantita);

			printf("Nuovo costo: ");
			scanf("%f", &a1.prezzo);
			
			fseek(fp, -48, SEEK_CUR);
			
			fwrite(&a1, sizeof(attrezzo), 1, fp);
			
			printf("\nModifica effettuata!\n");  }
	
	         }

		    fclose(fp);
		
		    if (!trovato)
			
			printf("\nIl record cercato non esiste!\n"); }
			
			system("pause");  }	

/* cancellazione di un record */

void Cancella() {
		
		char nome_cercato[20]; 
		
		int trovato = 0;
		
		if ((fp = fopen("Hardware", "r+")) == NULL)
			
			printf("\nErrore. L'archivio non esiste!\n");
		
		else {

			printf("\nNome da cancellare: ");
			scanf("%s", nome_cercato);
		
		while ((!trovato) && (!feof(fp)))  {
			
			fread(&a1, sizeof(attrezzo), 1, fp);
		
		if (!strcmp(a1.nome, nome_cercato) && (!a1.cancellato)) {
				
				trovato = 1;
				
				a1.cancellato = 1;
				
				fseek(fp, -48, SEEK_CUR);
				
				fwrite(&a1, sizeof(attrezzo), 1, fp);
				
				printf("\nCancellazione effettuata!\n");
			
		     	}

       }

	fclose(fp);
	
	if (!trovato)
	
	printf("\nIl record cercato non esiste!\n");
	
		}
	
	system("pause");
	
	}

Spero possiate aiutarmi =)

3 Risposte

  • Re: Esercizio gestione oggetti di un negozio con FILE

    Dove sono i code tags? Aiutaci ad aiutarti.
  • Re: Esercizio gestione oggetti di un negozio con FILE

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct {
    
    int numRecord;
    char nome[20];
    int quantita;
    float prezzo;
    int cancellato; }attrezzo;
    
    attrezzo a[100];
    attrezzo a1;
    
    FILE *fp;
    
    void Elenca();
    void Inserisci();
    void Ricerca();
    void Modifica();
    void Cancella();
    
    int main() {
    
    int scelta;
    
    do {
    
    printf("GESTIONE ARCHIVIO ATTREZZI");
    printf("\n1. Visualizza il contenuto del file");
    printf("\n2. Inserisci un record");
    printf("\n3. Ricerca uno attrezzo");
    printf("\n4. Modifica i dati di un attrezzo");
    printf("\n5. Cancella un record");
    printf("\nFa la tua scelta: ");
    
    scanf("%d", &scelta);
    
    if ((scelta > 5) || (scelta < 1))
    
    printf("\nScelta non valida. Riprova!");
    
    switch (scelta) {
    
    case 1: Elenca(); break;
    
    case 2: Inserisci(); break;
    
    case 3: Ricerca(); break;
    
    case 4: Modifica(); break;
    
    case 5: Cancella(); break; }
    
    }while (scelta != 6);
    
    system("PAUSE");
    
    return 0;
    
    }
    
    void Elenca() {
    
    ... //devo farla
    
    /* inserimento di un record */
    
    void Inserisci() {
    
    fp = fopen("Hardware", "w");
    
    printf("\nINSERISCI NUOVO STRUMENTO:\n");
    
    printf("numero record ");
    scanf("%d", &a1.numRecord);
    
    printf("nome: ");
    scanf("%s", a1.nome);
    
    printf("quantita: ");
    scanf("%d", &a1.quantita);
    
    printf("prezzo: ");
    scanf("%f", &a1.prezzo);
    
    a1.cancellato = 0;
    
    fwrite(&a1, sizeof(attrezzo), 1, fp);
    
    fclose(fp);
    
    printf("\nInserimento effettuato!\n");
    
    }
    
    /* ricerca di un record */
    
    void Ricerca() {
    
    char nome_cercato[20];
    
    int trovato = 0;
    
    if ((fp = fopen("Hardware", "r")) == NULL)
    
    printf("\nErrore. L'archivio non esiste!\n");
    
    else {
    
    printf("\nattrezzo da cercare: ");
    scanf("%s", nome_cercato);
    
    while ((!trovato) && (!feof(fp))){
    
    fread(&a1, sizeof(attrezzo), 1, fp);
    
    if (!strcmp(a1.nome, nome_cercato) && (a1.cancellato == 0)) {
    
    trovato = 1;
    
    printf("\nNumero Record: %d", a1.numRecord);
    printf("\nNome: %s", a1.nome);
    printf("\nQuantita: %d", a1.quantita);
    printf("\nPrezzo: %.2f\n", a1.prezzo);
    
    }
    
    }
    
    fclose(fp);
    
    if (!trovato)
    
    printf("\nIl record cercato non esiste!\n");
    
    }
    
    system("pause");
    
    }
    /* modifica di un record */
    
    void Modifica() {
    
    char nome_cercato[20];
    
    int trovato = 0;
    
    if ((fp = fopen("Hardware", "r+")) == NULL)
    
    printf("\nErrore. L'archivio non esiste!\n");
    
    else {
    
    printf("\nNome da modificare: ");
    scanf("%s", nome_cercato);
    
    while ((!trovato) && (!feof(fp))) {
    
    fread(&a1, sizeof(attrezzo), 1, fp);
    
    if (!strcmp(a1.nome, nome_cercato) && (!a1.cancellato)) {
    
    trovato = 1;
    printf("\n\n");
    
    
    printf("Nuova quantita: ");
    scanf("%d", &a1.quantita);
    
    printf("Nuovo costo: ");
    scanf("%f", &a1.prezzo);
    
    fseek(fp, -48, SEEK_CUR);
    
    fwrite(&a1, sizeof(attrezzo), 1, fp);
    
    printf("\nModifica effettuata!\n"); }
    
    }
    
    fclose(fp);
    
    if (!trovato)
    
    printf("\nIl record cercato non esiste!\n"); }
    
    system("pause"); }
    
    /* cancellazione di un record */
    
    void Cancella() {
    
    char nome_cercato[20];
    
    int trovato = 0;
    
    if ((fp = fopen("Hardware", "r+")) == NULL)
    
    printf("\nErrore. L'archivio non esiste!\n");
    
    else {
    
    printf("\nNome da cancellare: ");
    scanf("%s", nome_cercato);
    
    while ((!trovato) && (!feof(fp))) {
    
    fread(&a1, sizeof(attrezzo), 1, fp);
    
    if (!strcmp(a1.nome, nome_cercato) && (!a1.cancellato)) {
    
    trovato = 1;
    
    a1.cancellato = 1;
    
    fseek(fp, -48, SEEK_CUR);
    
    fwrite(&a1, sizeof(attrezzo), 1, fp);
    
    printf("\nCancellazione effettuata!\n");
    
    }
    
    }
    
    fclose(fp);
    
    if (!trovato)
    
    printf("\nIl record cercato non esiste!\n");
    
    }
    
    system("pause");
    
    }
    
    
    Spero di averlo scritto bene ora, scusate lo sbaglio =)
  • Re: Esercizio gestione oggetti di un negozio con FILE

    fseek(fp, -48, SEEK_CUR);
    1.Perché 48?
    2. Perché non usi variabili locali ma vettore di strutture e FILE sono globali?
Devi accedere o registrarti per scrivere nel forum
3 risposte