allora, cerco di essere il più schematico possibile
1) ho risolto adesso con la fwrite, era un errore sul file e pensavo di sbagliare ad usare la funzione, quindi passiamoci su.
2) parlo di più contatti. supponiamo di avere una struct rubrica con un size_t ed un puntatore che punta alla struct contatto mi segui?
quindi io non avrò nel file solo
nome cognome e telefono ma avrò:
nome1, cognome1, telefono1, nome2, cognome2, telefono2, ... , nomeN, cognomeN, telefonoN.
stavo provando a scriverlo da solo ma torno a fare l'errore di ieri del doppio puntatore il che ci porta al punto 3.
3) ti prego puoi provare a spiegarmi perchè si usa questo doppio puntatore per gestire le malloc interne alle funzioni? sennò continuerò a sbagliare tutti gli esercizi di questo tipo..
4) le fread tu mi hai detto leggono in sequenza i dati dal file e le vanno mettendo all'interno degli array uno dietro l'altro. ma come faccio a dire loro "leggi solo 1 dato e mettilo dentro questo array" oppure leggi a cicli di 3 dati?
per rendere più chiara la situazione posto il codice:
come si nota all'inizio della prima funzione cerco (senza riuscirci di mettere dentro un size_t un intero a 32 bit senza segno che si trova all'inizio del file binario ed indica quanti contatti ci sono nella mia rubrica.
codice:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
/* definisco la struttura */
struct contatto {
char nome[255];
char cognome[255];
char telefono[255];
};
struct rubrica {
size_t size;
struct contatto *contatti;
};
struct rubrica *link;
/* corpo della prima1 funzione */
void rubrica_read_bin (struct rubrica *pr,FILE *f) {
unsigned int i;
fscanf(f, "%lu", &pr->size);
pr->contatti=malloc(pr->size*sizeof(struct contatto));
for(i=0;i<pr->size;i++)
fread(pr->contatti, sizeof(struct contatto), 1, f);
}
/* corpo della seconda funzione */
void rubrica_print (struct rubrica *pr, FILE *f) {
unsigned int i;
for(i=0;i<pr->size;i++)
fprintf(f, "nome: %s, \ncognome: %s, \ntelefono: %s.\n", pr->contatti[i].nome, pr->contatti[i].cognome, pr->contatti[i].telefono);
}
/* corpo della terza funzione */
int rubrica_find_by_name (struct rubrica *pr, char* name){
return 0;
}
/*corpo principale */
main(){
FILE *frp;
FILE *fwp;
frp=fopen("rubrica1.bin", "rb");
fwp=fopen("contatto.txt", "wt");
if (frp==NULL || fwp==NULL){
printf("errore nell'apertura di un file");
system("pause");
exit(1);
}
link=malloc(sizeof(struct rubrica));
rubrica_read_bin (link, frp);
rubrica_print (link, fwp);
/* rubrica_find_by_name(link, nome); */
}
attendo in linea, grazie mille oregon!