Buonasera a tutti,
mi sono appena registrato, seguo questo forum da parecchio tempo per le varie guide, ma ora ho bisogno del vostro aiuto! Sto implementando un programma in C che debba scrivere su file un array di struct. Il problema è il seguente:
se utilizzo fwrite viene scritto un solo array e anche male sul file e tutto su una riga, mentre se utilizzo fprint la scrittura viene formattata ma ho problemi nel ricercare un elemento.
Grazie in anticipo.
Questo è il codice dei 3 moduli del programma.
main.c
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include "cerca.h" #include "marcatore.h" #include "menu.h" //#include "lettura.h" #define N 100 calciatore inserisci_marcatore(FILE *fp); void cerca(FILE *fp, calciatore marcatore[N]); int menu(void); //void lettura(FILE *fp); calciatore marcatore[N]; int main() { FILE *fp; int scelta; if ((fp = fopen("calcio.txt", "ab+")) == NULL) { printf("Il File non può essere aperto"); } else { while ((scelta = menu()) != 4) { switch (scelta) { case 1: marcatore[N] = inserisci_marcatore(fp); break; case 2: cerca(fp,marcatore); break; case 3: break; default: break; } } } return 0; }
marcatore.h
cerca.hcodice:#define N 100 typedef struct { char nome[20], cognome[20], squadra[20]; int goal; }calciatore; calciatore inserisci_marcatore(FILE *fp) { int i, n; calciatore marcatore[N]; if ((fp = fopen("calcio.txt", "rb+")) == NULL) { printf("Il file non esiste"); } else { fprintf(fp, "%-19s%-23s%-23s%4s", "Nome", "Cognome", "Squadra", "Goal\n"); printf("Inserire numero marcatori:"); scanf("%d", &n); for (i = 0; i < n; i++) { printf("Inserire nome del marcatore:\n"); scanf("%s", marcatore[i].nome); printf("Inserire cognome del marcatore:\n"); scanf("%s", marcatore[i].cognome); printf("Inserire squadra di appartenenza:\n"); scanf("%s", marcatore[i].squadra); printf("Inserire numero di goal segnati:\n"); scanf("%d", &marcatore[i].goal); } for (i = 0; i < n; i++) { printf("Prova stampa: marcatore[%d] Nome:%s Cognome:%s Squadra:%s Goal:%d\n", i, marcatore[i].nome, marcatore[i].cognome, marcatore[i].squadra, marcatore[i].goal); /*fprintf(fp, "%-19s%-23s%-23s%4d\n", marcatore[i].nome, marcatore[i].cognome, marcatore[i].squadra, marcatore[i].goal);*/ fwrite(&marcatore, sizeof(calciatore), 1, fp); fseek(fp, sizeof(calciatore), SEEK_CUR); } } fclose(fp); return(marcatore[N]); }
codice:#include "marcatore.h" #define N 100 void cerca(FILE *fp, calciatore marcatore[N]) { if ((fp = fopen("calcio.txt", "rb+")) == NULL) { printf("Il File non può essere aperto"); } else { int flag = 0,i; char cercaCognome[20]; calciatore marcatore[N]; printf("Inserisci il cognome del calciatore da cercare\n"); scanf("%s", cercaCognome); while (fread(marcatore,sizeof(calciatore), 1, fp)!=0) { for (i = 0; i <N; i++{ fscanf(fp,"%s",marcatore[i].cognome); //fseek(fp, sizeof(calciatore), SEEK_SET); if ((strcmp(cercaCognome, marcatore[i].cognome)) == 0) { flag = 1; printf("ECCO IL CALCIATORE CERCATO:"); printf("Cognome: %s\n", marcatore[i].cognome); printf("Squadra: %s\n", marcatore[i].squadra); printf("Numero di goal segnati: %d\n", marcatore[i].goal); } else{ if (flag == 0) { printf( "Non esiste nessun calciatore con questo cognome.\n"); } } } } } fclose(fp); }

Rispondi quotando