PDA

Visualizza la versione completa : [C] Strutture e file binari per lettura/scrittura elenco di utenti


lollinof19sm
14-12-2011, 21:45
ciao. Il programma compila ma purtroppo nel momento in cui dovrebbe stampare a video gli utenti il cui nome inizia con "me" non funziona, così come non stampa a video gli utenti che hanno un punteggio maggiore di una soglia minima inseriti da input.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIM 32


typedef struct {
char name[DIM];
int points;
} user;

int readPoints (char usersFile[], user results[], int maxDim, int
minPoints);

int readPoints (char usersFile[], user results[], int maxDim, int
minPoints){

FILE *f;
int i=0, stop=0, temp_1=0;
char temp[33];

f= fopen(usersFile, "wb");
if (f == NULL)
return -1;

do{
printf ("Inserire il nome: ");
scanf("%s", temp);
if (strcmp(temp,"fine")==0)
stop= 1;
else
fwrite(temp, sizeof(char[33]), 1, f);
printf("Inserire il punteggio: ");
scanf("%d", &temp_1);
fwrite(&temp_1, sizeof(int), 1, f);
} while (!stop && (strcmp(temp,"fine") != 0));

while (i<maxDim && (fread(&results[i], sizeof(user), 1, f)>0)){ /*
fin tanto che i è minore della dim max inserita da utente e c'è qualcosa da
leggere */
if (results[i].points >= minPoints)
printf ("s", results[i].name);
i++;
}

fclose(f);
return i;
}

int main()
{
user *v;
int x=0, y=0, l=0, i;

printf ("Inserire il numero di clienti salvati su file: ");
scanf ("%d", &x);

v= (user*) malloc(sizeof(user)*x);

printf ("Inserire il punteggio minimo: ");
scanf ("%d", &y);

l= readPoints("punti.dat", v, x, y);

for (i=0; i<l; i++){
if ((v[i].name[0] == 'm') && (v[i].name[1] == 'e'))
printf("L'utente %s ha %d punti.\n", v[i].name, v[i].points);}

free (v);
return 0;

}

oregon
14-12-2011, 21:55
La cosa più difficile da fare non è il programma ma il debugging.

Quando scrivi il programma e non funziona, dedica un po' di tempo alla sua correzione, non scrivere subito sul forum.

Hai fatto un po' di debugging? Hai eseguito linea per linea e hai controllato che ogni linea facesse quello che pensavi?

lollinof19sm
14-12-2011, 21:59
ciao. l'ho copiato in visual studio e l'ho fatto... purtroppo però non capisco dov'è l'errore! mi sembra corretto. ho passato tutto oggi a vedere come aggiustarlo perché tra poco ho l'esame ma non so dove diavolo sbaglio!

oregon
14-12-2011, 22:03
Mah ... guarda ... per capire qualcosa bisognerebbe sapere (anche a grandi linee) cosa fai con le varie parti di codice ...

Insomma, dei commenti sulle varie linee sarebbero utili per capire se sei sulla strada che intendi seguire.

Anche logicamente ...

Ad esempio, perché utilizzi una funzione in cui scrivi e leggi un file e che chiami readPoints?

lollinof19sm
14-12-2011, 22:11
Una società di telefonia cellulare gestisce un programma di premiazione per “utenti fedeli”. In particolare, per ogni cliente viene salvato su un file binario “punti.dat” il nome del cliente (al massimo 31 caratteri) e un numero intero che rappresenta i punti accumulati. Tali informazioni sono organizzate come una struttura user, opportunamente definita dal candidato:

#define DIM 32
typedef struct {
char name[DIM];
int points;
} user;


1) Si scriva una funzione:
int readPoints (char usersFile[], user results[], int maxDim, int minPoints)
che, ricevuto in ingresso il nome di un file usersFile, un array results di strutture user, la dimensione massima dell’array maxDim, e un limite inferiore di punti minPoints, copi nell’array results i dati dei clienti che hanno almeno i punti specificati da minPoints
La funzione deve restituire come risultato il numero di utenti con almeno minPoints; si noti che tale risultato rappresenta anche la dimensione logica dell’array results. Qualora il file non sia accessibile, la funzione deve restituire il valore -1;

2) Si scriva poi un programma main() che chieda all’utente il numero di clienti salvati sul file (tale numero sarà noto solo a tempo di esecuzione), e allochi dinamicamente un vettore V di user sufficientemente grande per poter contenere, nel caso peggiore, i dati di tutti gli utenti salvati in usersFile. Il programma dovrà poi chiedere all’utente il minimo punteggio e, utilizzando la funzione readPoints(), leggere da file e memorizzare in V i dati degli utenti che hanno almeno il punteggio minimo specificato. Il programma infine deve stampare a video il nome ed il punteggio degli utenti contenuti in V se e solo se il nome comincia per “Me”


oregon
14-12-2011, 22:16
Originariamente inviato da lollinof19sm
1) Si scriva una funzione:
int readPoints (char usersFile[], user results[], int maxDim, int minPoints)
che, ricevuto in ingresso il nome di un file usersFile, un array results di strutture user, la dimensione massima dell’array maxDim, e un limite inferiore di punti minPoints, copi nell’array results i dati dei clienti che hanno almeno i punti specificati da minPoints
La funzione deve restituire come risultato il numero di utenti con almeno minPoints; si noti che tale risultato rappresenta anche la dimensione logica dell’array results. Qualora il file non sia accessibile, la funzione deve restituire il valore -1;

Quindi questa funzione deve solamente leggere e non scrivere il file.

Si presuppone che il file sia già esistente (in quanto scritto in altra occasione).

Già con quel codice saresti "fuori tema".


2) Si scriva poi un programma main() che chieda all’utente il numero di clienti salvati sul file (tale numero sarà noto solo a tempo di esecuzione), e allochi dinamicamente un vettore V di user sufficientemente grande per poter contenere, nel caso peggiore, i dati di tutti gli utenti salvati in usersFile. Il programma dovrà poi chiedere all’utente il minimo punteggio e, utilizzando la funzione readPoints(), leggere da file e memorizzare in V i dati degli utenti che hanno almeno il punteggio minimo specificato. Il programma infine deve stampare a video il nome ed il punteggio degli utenti contenuti in V se e solo se il nome comincia per “Me”

Attenzione al nome (Me) che comincia con M maiuscola non minuscola ... e al fatto che la funzione può restituire -1 al main indicando che il file non esiste.

lollinof19sm
14-12-2011, 22:18
i nomi degli utenti li inserisco io (metto tutte minuscole). Poi: si li ho sbagliato (nel mettere l'apertura del file nella funzione), ma ciò non dovrebbe impedire il corretto funzionamento del programma intero.

oregon
14-12-2011, 22:21
E invece può, dato che il file è aperto per la scrittura e quando leggi il puntatore è alla fine del file non all'inizio.

In ogni caso è logicamente sbagliato ... scrivi esattamente il codice richiesto e non altro. E' importante all'esame.

lollinof19sm
14-12-2011, 22:27
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIM 32


typedef struct {
char name[DIM];
int points;
} user;

int readPoints (char usersFile[], user results[], int maxDim, int
minPoints);

int readPoints (char usersFile[], user results[], int maxDim, int
minPoints){

int i=0, stop=0, temp_1=0;
char temp[33];

do{
printf ("Inserire il nome: ");
scanf("%s", temp);
if (strcmp(temp,"fine")==0)
stop= 1;
else
fwrite(&temp, sizeof(char[33]), 1, usersFile);
printf("Inserire il punteggio: ");
scanf("%d", &temp_1);
fwrite(&temp_1, sizeof(int), 1, usersFile);
} while (!stop && (strcmp(temp,"fine") != 0));

while (i<maxDim && (fread(&results[i], sizeof(user), 1, usersFile)>0)){ /*
fin tanto che i è minore della dim max inserita da utente e c'è qualcosa da
leggere */
if (results[i].points >= minPoints)
printf ("s", results[i].name);
i++;
}

fclose(usersFile);
return i;
}

int main()
{
user *v;
FILE* f;
int x=0, y=0, l=0, i;

f= fopen("punti.dat", "wb");
if (f == NULL)
return -1;

printf ("Inserire il numero di clienti salvati su file: ");
scanf ("%d", &x);

v= (user*) malloc(sizeof(user)*x);

printf ("Inserire il punteggio minimo: ");
scanf ("%d", &y);

l= readPoints(f, v, x, y);

for (i=0; i<l; i++){
if ((v[i].name[0] == 'm') && (v[i].name[1] == 'e'))
printf("L'utente %s ha %d punti.\n", v[i].name, v[i].points);}

free (v);
return 0;

}

Ora però sono incasinato con "usersFile" usato nella funzione per riferirmi al file, che però nel prototipo c'è scritto che è un array di caratteri...

oregon
14-12-2011, 22:57
Non hai fatto nulla di quanto ti ho detto ...

Loading