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 =)