[C]Aiuto su programma

pinox1
ciao a tutti ho un problema con questo programma in c ,non riesco a compilare in maniera corretta la ricerca .
grazie a tutti per l'aiuto.


TRACCIA:
4) Si rediga un programma in C nella gestione di un file che tenga traccia del calendario giornaliero per le prenotazioni aule per esami universitari.
Contenga una struttura:
.aula (char)
.nome esame(char 30)
.cognome docente(char 30)
.anno in corso(int)
.ora inizio(int ora,int minuti)
.tempo della prova (int)

Domande:
1) inserimento nuovi record
2) visualizzare informazioni di tutte le prenotazioni esami/esoneri primo anno
3) vvvisualizzare le informazioni delle aule prenotate nella fascia orario compresa dalle 10:00 alle 13:00



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N20
FILE * fp;

typedef struct
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;

prenotazione mia_prenotazione;
//prototipo delle funzioni//

void inserimento();
void ricerca();
void visualizza();
int main()
{
int operazione;
fp=fopen("C:\\File.txt","r+b"); /*apertura file modalità binaria in scrittura e lettura*/
if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL)
{

fp=fopen("C:\\File.txt","w+b"); // Apre o crea un file binario in lettura e scrittura//
if (!fp)
{
printf("Impossibile aprire il file\n");
exit(1);
}
}
do
{
printf("SCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:
inserimento();
break;
case 2:
ricerca();
break;
case 3:
visualizza();
break;
}}
while(operazione!='3');
fclose(fp);

return 0;
}
void inserimento(void)
{
FILE *fp;
fflush(stdin);
if((fp=fopen("C:\\File.txt","a"))==NULL)

{
printf("\nimpossibile aprire il file");
exit(1);
}
else
{
printf("\n inserire aula\n");
scanf("%s",mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s",mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s",mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fflush(stdin);
fwrite(&mia_prenotazione,sizeof(prenotazione),1,fp);

}
fclose(fp);
}

void ricerca()
{
prenotazione datiletti;

int k=0;
FILE *fp;
fp=fopen("C:\\File.txt","r");
fseek(fp,0L, SEEK_SET);
while(fread(&mia_prenotazione,sizeof(prenotazione),1,fp)>0)
{
if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1)
k ++;
printf("\n******************************************************\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);

printf("\n******************************************************\n");
}
fclose(fp);
}

void visualizza()
{
FILE *fp;
fp=fopen("C:\\File.txt","r");
fseek(fp,0L, SEEK_SET);
while(fread(&mia_prenotazione,sizeof(prenotazione),1,fp)==1)
{
if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13)
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
fclose(fp);
}

Risposte
Omega1
Ciao!

Ho letto la tue traccia, e posso suggerirti le seguenti modifiche:
1-> Passa per argomento la variabile del file alle funzioni, in questo modo, rendi il programma più flassibile, ed eviti il problema delle chiusure/ aperture sovrapposte.

2-> EVITA come la peste l' istruzione "fflush(stdin)", il suo comportamento è imprevedibile.

3-> Ho scritto alcune piccole modifiche al programma - vedi i commenti -. Per maggiori informazioni, eventualmente posta i tuoi dubbi.

Ecco il sorgente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//FILE *fp; MODIFICA elimino la variabile locale fp

typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;

//prenotazione mia_prenotazione; MODIFICA: abolisci la variabile globale "mia_prenotazione"
//prototipo delle funzioni//

void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **);     // passo il riferimento al file di lavoro.
void visualizza(FILE **);
void SvuotaBuffer();

int main(int argv, char *argc[])
{
int operazione;
char percorso[]="G:\\file\\file.txt";
FILE *fp;
fp=fopen(percorso,"r+b"); /*fp=fopen("C:\\File.txt","r+b"); apertura file modalità binaria in scrittura e lettura*/
if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL)
{
   // Se il file non esiste
   fp=fopen(percorso, "wb+");
   if (!fp)
   {
     printf("Impossibile aprire il file\n");
     return 0; // MODIFRCA  il file viene aperto solo i modalità di lettura e scrittura
   }
}
do
{
printf("SCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
switch(operazione)
{
case 1:{
           inserimento(&fp);
           break;
       }
case 2:{
         ricerca(&fp);
         break;
       }
case 3:{
          visualizza(&fp);
          break;
        }
}
} while (operazione<=3);
// while(operazione!='3'); // modifica  cambio della condizione d' ucsita
fclose(fp);

return 0;
}
void inserimento(FILE **g)
{
// fflush(stdin); MODIFICA  EVITA COME LA PESTE fflush(stdin): il suo comportamento è imprevedibile!!
SvuotaBuffer();
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fflush(stdin);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
}

void ricerca(FILE **g)
{
//prenotazione datiletti;
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione

int k=0;
fseek(*g,0L, SEEK_SET);

while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)>0)
{
if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1)
k ++;
printf("\n******************************************************\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);

printf("\n******************************************************\n");
}
//fclose(fp); MODIFICA elimino la cciusura del file
}

void visualizza(FILE **g)
{
/*FILE *fp;
fp=fopen("C:\\File.txt","r"); MODIFICA elimino la variabile locale fp */
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
fseek(*g,0L, SEEK_SET);
// while(fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g)!= EOF) MODIFICA cambio la condizione d' uscita del file
while (!feof( *g))
{
// if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) MODIFICA Cambio la condizione if
fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
  printf("\t%s",mia_prenotazione.aula);
  printf("\t%s",mia_prenotazione.docente);
  printf("\t%s\n",mia_prenotazione.nome_esame);
}
}
//fclose(fp); MODIFICA elimino la cciusura del file
}

void SvuotaBuffer() // MODIFICA aggiungo una piccola funzione per svuotare il buffer.
{
    while (getchar() != '\n') ;
}


pinox1
grazie tante per l'aiuto
mi dà errore nella riga:
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);-->indicandomi 'g' come errore.
:cry:

pinox1
ho sistemato gli errori ,ora l'unica cosa che non funziona è che il video compare per pochi secondi...
;-)

faximusy
Se sei in windows, aggiungi la riga:

system("pause");

dove vuoi che il calcolatore si fermi in attesa di un tuo cenno :D

pinox1
grazie tante per il consiglio ,
ho provato ma non dà cenno di vita.
:?

Omega1
"pinox":
grazie tante per il consiglio ,
ho provato ma non dà cenno di vita.
:?


Non so proprio che dirti! A me funziona. Riposta il codice con le correzioni

pinox1
ecco speriamo bene:
:)


**********
#include
#include
#include



typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;


//prototipo delle funzioni//

void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **); // passo il riferimento al file di lavoro.
void visualizza(FILE **);
void SvuotaBuffer();

int main(int argv, char *argc[])
{
int operazione;
char percorso[]="G:\\file\\file.txt";
FILE *fp;
fp=fopen(percorso,"r+b"); /*fp=fopen("C:\\File.txt","r+b"); apertura file modalità binaria in scrittura e lettura*/
if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL)
{
// Se il file non esiste
fp=fopen(percorso, "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("SCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
system("pause");
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
visualizza(&fp);
break;
}
}
} while (operazione<=3);
// while(operazione!='3'); // modifica cambio della condizione d' ucsita
fclose(fp);
system("pause");
return 0;
}
void inserimento(FILE **g)
{
// fflush(stdin); MODIFICA EVITA COME LA PESTE fflush(stdin): il suo comportamento è imprevedibile!!
SvuotaBuffer();
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fflush(stdin);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
system("pause");
}

void ricerca(FILE **g)
{
//prenotazione datiletti;
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione

int k=0;
fseek(*g,0L, SEEK_SET);

while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)>0)
{
if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1)
k ++;
printf("\n******************************************************\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);

printf("\n******************************************************\n");

}
//fclose(fp); MODIFICA elimino la cciusura del file
}

void visualizza(FILE **g)
{
/*FILE *fp;
fp=fopen("C:\\File.txt","r"); MODIFICA elimino la variabile locale fp */
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
fseek(*g,0L, SEEK_SET);
// while(fread(&mia_prenotazione, sizeof(prenotazione), 1 , **g)!= EOF) MODIFICA cambio la condizione d' uscita del file
while (!feof( *g))
{
// if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) MODIFICA Cambio la condizione if
fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);

}
}
//fclose(fp); MODIFICA elimino la cciusura del file
}

void SvuotaBuffer() // MODIFICA aggiungo una piccola funzione per svuotare il buffer.
{
while (getchar() != '\n') ;
}

Omega1
Non visualizza nemmeno il menù iniziale?
In tal caso controlla il percorso del file da aprire.

Io ho dichiarato:
  ...
  char percorso[]="G:\\file\\file.txt"; 
  FILE *fp; 
  fp=fopen(percorso,"r+b"); 
  ...


E probabile che sul tuo computer non esiste la cartella " G:\file ".

apatriarca
Al momento sono in Giappone e non ho quindi il tempo di controllare bene il tuo codice. Ma qualche domanda potrebbe aiutare a capire meglio la causa:
1. Che compilatore stai usando e su quale piattaforma?
2. Qual'è l'output generato dal tuo compilatore? Hai per esempio controllato che il codice venga generato correttamente?
3. In quale punto dell'esecuzione il programma termina l'esecuzione (sempre se riesci ad eseguire qualcosa)?
4. Hai provato ad eseguire il debug?

pinox1
grazie per l'aiuto
-sto usando visual studio 2008 in piattaforma window
-l'errore è praticamente che compare la finestra per un istante senza visualizzare nulla
-è il compilatore non rileva nessun errore
-con il debug non ne vengo a capo...
:( :(

pinox1
funziona ,
ho sistemato il percorso
char percorso[]="C:\\file.txt";
non funziona la logica della visualizzione delle info degli esami solo del primo anno..
:P

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.