PDA

Visualizza la versione completa : [C] Array di struct


Nort
05-04-2017, 15:03
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

#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

#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

#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);
}

oregon
05-04-2017, 15:13
fprintf scrive i dati in ASCII e quindi questi risulteranno leggibili con un qualsiasi editor. Non vedo perché tu abbia problemi a fare ricerche.

fwrite scrive in binario e quindi dovrai rileggere in binario con fread.

Non puoi mischiare le due modalità.

Nort
05-04-2017, 15:19
Quando ricerco ritorna al menu, si ferma al for. Ho provato a leggere con fread, ma non trova comunque nulla ç_ç

oregon
05-04-2017, 15:29
Intanto il codice non si scrive nei file .h ma nei file .cpp.

Poi vedo che per l'inserimento usi la fwrite e per la lettura la fscanf. Ti ho detto che non devi mischiare le due modalità, se il file è aperto in binario (rb+) devi usare fwrite/fread.

Nort
05-04-2017, 15:35
Grazie mille, ho corretto nella ricerca. Però rimane sempre il problema che scrive solo il primo marcatore, non va avanti, anche se nella printf di test li segnala entrambi inseriti

oregon
05-04-2017, 16:16
Ci sono molte incongruenze nel programma. Ad esempio tu indichi un certo numero di record da salvare e poi nella ricerca cerchi di leggerne sempre 100 anche se non esistono.

E che vuol dire esattamente "non va avanti"?

Nort
05-04-2017, 16:40
Mi conviene allocarne dinamicamente la dimensione e lavorare con quella?

Loading