PDA

Visualizza la versione completa : dritte su programma in C, file binario


davidemo89
14-07-2010, 21:20
Ciao a tutti, io ho creato un file binario in C che contiene una sorta di rubrica caratterizzata dalla seguente struttura:



typedef struct{
char nominativo[DIMN];
char telefono[DIMT];
char datanascita[DIMD];
char comune[DIMC];
}Contatto;


ho creato una funzione che permette all'utente di inserire nuovi contatti quindi immaginatevi ora il file binario con all'intero 2 o 3 contatti inseriti dall'utente tutti caratterizzati dalla stessa struttura Contatto come sopra.

Ora volevo chiedervi: se volessi stampare a video una specie di "rubrica" del tipo:

Nominativo Telefono Data di nascita Comune

nominativo1 tel1 data1 comune1
nominativo2 tel2 data2 comune2
nominativo3 tel3 data3 comune3

ho fatto una funzione del genere:



/*
Nome: stampa_tutto
Descrizione: stampa la rubrica
Input: il puntatore al file binario, gli elementi presenti in rubrica
Output: nessuno
*/
void stampa_tutto(FILE *fp, int n){

Contatto contatto;
char nominativo[DIMN],telefono[DIMT],datanascita[DIMD],comune[DIMC];
int i;

for(i=0;i<n;i++){
fseek(fp,i*sizeof(contatto),SEEK_SET);
fread(nominativo,1,DIMN,fp);
fread(telefono,1,DIMT,fp);
fread(datanascita,1,DIMD,fp);
fread(comune,1,DIMC,fp);
printf("%s %s %s %s",nominativo,telefono,datanascita,comune);
}
printf("\n");
return;
}

ma stampa cose senza senso miste a cose "semi-corrette"....sicuramente non funziona come dovrebbe.... se utilizzo fseek(fp,i*sizeof(contatto),SEEK_SET);
mi sposto di blocco in blocco fra i contatti ma non so come accedere ad esempio al dato "telefono" del terzo contatto, oppure al dato "comune" del primo contatto, ecc...

qualcuno mi dia delle dritte!!!! Grazie mille!

oregon
14-07-2010, 22:43
Al posto di tutte queste fread


Originariamente inviato da davidemo89
fread(nominativo,1,DIMN,fp);
fread(telefono,1,DIMT,fp);
fread(datanascita,1,DIMD,fp);
fread(comune,1,DIMC,fp);


utilizza solo questa

fread (&contatto, sizeof(contatto), 1, fp);

Importante: fai lo stesso con la fwrite, elimina il vecchio file e riscrivilo per fare una prova corretta.

davidemo89
15-07-2010, 10:33
Ho fatto come dici tu, adesso ti mostro l'intero codice perchŔ si presentano ancora due problemi:


#include <stdio.h>
#include <stdlib.h>
#define DIMN 20
#define DIMT 15
#define DIMD 8
#define DIMC 15

typedef struct{
char n[DIMN];//nominativo
char t[DIMT];//telefono
char d[DIMD];//data nascita
char c[DIMC];//comune nascita
}Contatto;



/*
Nome: aggiungi
Descrizione: aggiunge un contatto alla rubrica
Input: il puntatore al file binario, gli elementi presenti in rubrica
Output: il nuovo numero di elementi presenti in rubrica
*/
int aggiungi(FILE *fp, int n){

Contatto contatto;

fflush(stdin);
printf("Inserisci cognome e nome: ");
gets(contatto.n); //per acquisire anche lo spazio tra nome e cognome
printf("Inserisci numero telefonico: ");
scanf("%s",contatto.t);
printf("Inserisci data di nascita (gg/mm/aa): ");
scanf("%s",contatto.d);
printf("Inserisci comune: ");
scanf("%s",contatto.c);
fseek(fp,0,SEEK_END);
fwrite(&contatto,1,sizeof(contatto),fp);
printf("\n\n");

return;
}

/*
Nome: stampa_tutto
Descrizione: stampa la rubrica
Input: il puntatore al file binario, gli elementi presenti in rubrica
Output: nessuno
*/
void stampa_tutto(FILE *fp, int n){

Contatto contatto;
int i;

printf("%-20s%-15s%-15s%-20s\n\n","Nominativo","Telefono","Data Nascita","Luogo Nascita");
for(i=0;i<n;i++){
fseek(fp,((i)*(sizeof(contatto))),SEEK_SET);
fread(&contatto,1,sizeof(contatto),fp);
//printf("%s",contatto.d);
printf("%-15s %-15s %-8s %-15s\n",contatto.n,contatto.t,contatto.d,contatto.c);
}
printf("\n");
return;
}

int main(){

FILE *fp;
int x,n=-1;
Contatto contatto;


fp=fopen("Rubrica.dat","rb+");
if(fp == NULL){
fp=fopen("Rubrica.dat","wb");
fclose(fp);
}
fp=fopen("Rubrica.dat","rb+");

while(feof(fp)==0){ //conto quanti sono i contatti giÓ salvati
fread(&contatto,1,sizeof(contatto),fp);
n++;
}
printf("In rubrica ci sono %d contatti\n\n",n);

do{
printf("(1) Aggiungi\n(2) Stampa rubrica\n(0) Esci\n");
printf("--> ");
scanf("%d",&x);
switch(x){
case 1: n=aggiungi(fp,n);
break;
case 2: stampa_tutto(fp,n);
break;
}
}while(x > 0);

fclose(fp);
system("PAUSE");
return 0;
}


Tralasciando il problema della formattazione del testo ecco quello che succede:

http://img210.imageshack.us/img210/34/rubc.jpg (http://img210.imageshack.us/i/rubc.jpg/)

oregon
15-07-2010, 22:40
Mi domando come faccia il programma ad essere compilato se la funzione

int aggiungi(FILE *fp, int n){

che dovrebbe restituire un valore, non lo fa, visto che termina con

return;
}

Loading