PDA

Visualizza la versione completa : [C] Problema fwrite, programma elenco scuola


fabio1234
20-02-2015, 09:32
Salve,
ho riscontrato un problema durante la programmazione di un esercizio dato dal mio professore di informatica. Sinceramente la sintassi credo sia giusta, solamente che il programma non funziona. Il problema è sulla fwrite in quanto non scrive nullla,non so per quale motivo:dhò:. Vi allego il codice dove ho evidenziato il punto in cui c'è il bug, grazie per la disponibilità.



#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
void menu();
void Inserisci();
int numeromatricola();
void Ricerca(int,bool&);
void Visualizza();
void ordina();
int FileSize();
char nomefile[]="scuola.dat";
struct alunni {
int matricola;
char nome [20];
char cognome[20];
char classe [5];
}p;
FILE *f;
int N;
int main(){
system("cls");
f=fopen("scuola.dat","ab");
bool fine=false,trovare=false;
int l;
char scelta;
N=FileSize();
do {
menu();
printf("Scelta:\t "); scelta=getche ();
printf("\n");
switch (scelta){
case '1': fclose(f);
Inserisci();
break;
case '2': fclose(f);
Visualizza();
break;
case '3': fclose(f);
fflush(stdout);
fflush(stdin);
printf("Inserisci il numero di matricola dell'alunno da ricercare:\t");
scanf("%d",&l);
Ricerca(l,trovare);
if(trovare){
printf("Le informazioni dell'alunno sono:\nNumero Matricola:%d\tCognome:%s\n",p.matricola,p.cognome);
printf("Nome:%s\tClasse:%s\n",p.nome,p.classe);
}
else printf("L'alunno non e' presente nell'elenco\n");
break;

case '4': fine=true;
break;
default: printf("\nLa scelta effetuttata corrisponde a una funzione inesistente (da 1 a 2)\n");
break;
}
f=fopen("scuola.dat","ab");
} while (!fine);
system ("pause");
}

void menu () {
printf("\t SCUOLA \n");
printf("\t1. Inserisci Studente \n");
printf("\t2. Visualizza \n");
printf("\t3. Ricerca \n");
printf("\t4. Fine \n")
}

void Inserisci(){
f=fopen("scuola.dat","ab");
if(f==NULL) printf("NON RIESCO AD APRIRE IL FILE ");
printf("Inserisci il nome dell'alunno:\t");
gets(p.nome);
printf("Inserisci il cognome dell'alunno:\t");
gets(p.cognome);
printf("Inserisci la classe dell'alunno:\t");
gets(p.classe);
p.matricola=numeromatricola();
printf("Numero Matricola=%d\n",p.matricola);
printf("Ho scritto ben %d byte ",fwrite(&p,sizeof(struct alunni),1,f));
fclose(f);
N=FileSize();
if(N>1){
ordina();}
}

int numeromatricola(){
srand(time(NULL));
bool trovato=false;
int ty;
do{
ty=rand()%1000+1;
Ricerca(ty,trovato);
}while(trovato);
return ty;
}

void ordina(){
alunni q;
f=fopen("scuola.dat","r+b");
int nrec=FileSize();
bool scambio=false;
int sup=nrec-1;
do{
sup--;
scambio=false;
for(int i=0; i<=sup; i++){
fseek(f,i*sizeof(alunni),SEEK_SET);
fread(&p,sizeof(alunni),1,f);
fseek(f,(i+1)*sizeof(alunni),SEEK_SET);
fread(&q,sizeof(alunni),1,f);
if(p.matricola>q.matricola) {
fseek(f,i*sizeof(q),SEEK_SET);
fwrite(&q,sizeof(q),1,f);
fseek(f,(i+1)*sizeof(alunni),SEEK_SET);
fwrite(&p,sizeof(alunni),1,f);
scambio=true;
}
}
}while(scambio);
fclose(f);
}

void Ricerca(int k,bool &trov){
f=fopen("scuola.dat","rb");
int c;
int inf=0, sup=FileSize()-1;
trov=false;
while(inf<=sup && !trov){
c=(sup+inf)/2;
fseek(f,c*sizeof(alunni),SEEK_SET);
fread(&p,sizeof(alunni),1,f);
if(k>p.matricola) inf=c+1;
else
if(k<p.matricola) sup=c-1;
else trov=true;
}
fclose(f);
}

int FileSize(){
fseek(f,0,SEEK_END);
int w=ftell(f);
return w/sizeof(alunni);
}

void Visualizza(){
system("cls");
f=fopen("scuola.dat","rb");
fseek(f,0,SEEK_SET);
printf("\t\t\tElenco:");
while(fread(&p,sizeof(alunni),1,f)) {
printf("\n\tNumeroMatricola: %d\t Cognome:%s\n\tNome: %s\tClasse:%s\n \n",p.matricola,p.cognome,p.nome,p.classe);}
fclose(f);
system("pause");
}

oregon
20-02-2015, 12:17
Usa i tag CODE per il codice altrimenti si rinuncia a rispondere ...

LeleFT
20-02-2015, 12:41
@fabio1234
Quando posti del codice, ricordati di inserirlo all'interno degli appositi tag
... , così da mantenere indentazione e formattazione del codice, che altrimenti risulta piuttosto difficile da leggere.


Ciao. :ciauz:

fabio1234
21-02-2015, 12:24
@fabio1234
Quando posti del codice, ricordati di inserirlo all'interno degli appositi tag
... , così da mantenere indentazione e formattazione del codice, che altrimenti risulta piuttosto difficile da leggere.


Ciao. :ciauz:

Si non ci ero riuscito, grazie per avermelo modificato :)

Loading