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
codice:
#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]);
}
cerca.h
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);
}