Newsgroup: it.comp.lang.c
Titolo: Principiante







Ciao a tutti, ho provato a fare questo programma che 
visualizza un menù con inserimento, calcellazione e visualizzazione di una 
struttura (nome, cognome ed età)  su di un file.


Alla compilazione nessun errore, ma mettendo un printf di 
controllo dopo l'apertura del file ho visto che il file non viene 
aperto.


C'è un altro problema, nella funzione "Inse" di inserimento 
dopo che chiede quanti inserimenti si vogliono fare e legge l'intero con una 
"scanf" mi salta la richiesta(fatta con una "gets") del nome del primo 
inserimento.


Non capisco come mai non mi apra il file ho dichiarato il 
puntatore al file, inoltre ho inserito un controllo all'inizio del main() che se 
non riesce ad aprire il file allora lo crea sempre con "fopen" con modalità di 
accesso "w+".


Spero che qualcuno riesca ad aiutarmi e vi ringrazio sin da 
ora.
 


 


P.S.: Il programma non è finito perchè mi sono bloccato con 
questi problemi


 


#include "stdio.h"
#include "stdio.h"
#include 
"stdlib.h"
int inse(),canc(),visu(),esci();
int 
*opz[4]={
    (int 
*)inse,
    (int *)canc,
    (int 
*)visu,
    (int 
*)esci
    };
int o;
FILE *fp;
typedef struct 
dat{
 char nome[20];
 char cognome[20];
 int 
eta;
 };


 


int menu()
{
 int i;
 do 
{
  printf("1)  Inserisci 
\n");
  printf("2)  Cancella 
\n");
  printf("3)  Visualizza 
\n");
  printf("4)  Esci 
\n");
  printf("\n");
      
printf("Scelta: ");
  scanf("%1d",&i);
  } 
while((i!=1)&&(i!=2)&&(i!=3)&&(i!=4));
  return 
i;
}


 


inse ()


 


{
 int i,t;
 dat 
nce;
 printf("\nQuanti inserimenti vuoi fare? 
");
 scanf("%d",&i);
 printf("\n");
 for(t=1;t<=i;t++)
 {
  printf("\nInserisci 
il %d° nome ==> 
",t);
  gets(nce.nome);
  printf("\nInserisci il %d° 
cognome ==> 
",t);
  gets(nce.cognome);
  printf("\nInserisci la 
%dª età ==> 
",t);
  scanf("%d",&nce.eta);
  fwrite(&nce,sizeof(dat),1,fp);
 }
}


 


canc ()
{
}


 


visu ()
{
}


 


esci 
()
{
 fclose(fp);
 exit(0);
}


 


funz(f)
int (*f)();
{
 (*f)();
}


 


main()
{
 int 
*funzp;
 fp=fopen("a\\c++\dati","r+");
 if(fp==NULL)  fp=fopen("a\\c++\dati","w+");
  
 if(fp!=NULL) 
printf("Aperto\n"); else 
printf("Chiuso\n");
 for(;;)
 {
  o=menu();
  funzp=opz[o-1];
  funz(funzp);
 }
}


 


 



Così non dovrebbe più dare problemi con la gets...il resto non l'ho ancora
guardato...
inse ()
{
 int i,t;
 dat nce;
 printf("\nQuanti inserimenti vuoi fare? ");
 scanf("%d%*c",&i);
 printf("\n");
 for(t=1;t<=i;t++)
 {
  printf("\nInserisci il %d° nome ==> ",t);
  gets(nce.nome);
  printf("\nInserisci il %d° cognome ==> ",t);
  gets(nce.cognome);
  printf("\nInserisci la %dª età ==> ",t);
  scanf("%d",&nce.eta);
  fwrite(&nce,sizeof(dat),1,fp);
 }
}
Ciao
Enrico S.
--
Webmaster della Pagina NON Ufficiale del SonyCRX100
SonyCRX120,  SonyCRX140E/S, SonyCRX100EX, HP8100
HP8200, HP9100 & HP9200
http://www.freeweb.org/computer/SonyCRX100/





Ti ringrazio moltissimo, ci avevo pensato anche io a questa 
soluzione ma ho lasciato perdere dopo aver visto che mi faceva lo stesso scherzo 
anche nei cicli successivi se volevi fare 2 o più inserimenti. In effetti il %*c 
andava anche sulla "scanf" che leggeva l'età.  


Per quanto riguarda l'apertura del file, ho trovato da solo 
l'errore. Non so se hai notato il percorso del file? 
(a:\c++\dati.txt)


All'apertura del programma nel mio compilatore ho notato 
che la directory C++, creata da me in windows, veniva riportata 
così...C_~1, allora l'ho rinominata C ed ho cambiato il percorso 
nell'apertura del file.


Belli questi due errori eh? Tutta esperienza!


Ti ringrazio nuovamente.







Personalmente mi sono auto-abituato  anche io a mettere 
un %*c alla fine di ogni scanf...evita molti problemi...


 ha scritto nel messaggio
news:000601c116cc$ff0f0b40$65381497@it...
Per quanto riguarda l'apertura del file, ho trovato da solo l'errore. Non so
se hai notato il percorso del file? (a:\c++\dati.txt)
All'apertura del programma nel mio compilatore ho notato che la directory
C++, creata da me in windows, veniva riportata cosě...C_~1, allora l'ho
rinominata C ed ho cambiato il percorso nell'apertura del file.
bastava a:\\c++\\dati.txrt oppure a:/c++/dati.txt