Newsgroup: it.comp.lang.c
Titolo: problema gestione file con C

Dunque, per l'Uni devo fare un progetto in C che consiste nella gestione di
un elenco di indirizzi e numeri telefonici.
Il programma funziona parzialmente, in pratica solo nella gestione del file
con le informazioni delle persone.....usando gli stessi criteri nella
gestione del file con i numeri di telefono, il programma non trova i record
con i dati.
Altro problema: nell'inserimento dei numeri di telefono nel file, il
programma non memorizza lo 0 iniziale del numero, perchè essendo visto come
int, ovviamente lo 0 davanti non ha nessun senso...
allego il codice....
Per favore, aiutatemi...perchè per una serie di problemi che ho avuto.....se
non porto questo programma entro il 30 settembre dovrò partire per il
militare.....
----------------------------------------------------------------------------
---------------
/* Librerie incluse nel programma */
#include  <stdio.h>
#include  <stddef.h>       /* per la def di NULL */
#include  <stdlib.h>        /* per la def di EXIT */
#include  <string.h>       /* per includere le funzioni che trattano
stringhe */
#define  DIM  100
/* Definizione Record : la rubrica telefonica viene rappresentata
sequenzialmente in memoria, cioè come vettore di record (le strutture) - le
variabili qui sono tutte globali - */
typedef struct     {
 int  codice_persona ;
 char  cognome [50] ;
 char  nome [50] ;
 char  indirizzo [100] ;
}
persona ;
typedef struct     {
 int  codice_persona ;
 int  numero_telefono ;
 char  commento [50] ;
}
telefono ;
/* Prototipi delle funzioni utilizzate all'interno del programma */
void inserimento_persona ( ) ;
void ricerca_persona ( ) ;
void cancellazione_persona ( ) ;
void modifica_persona ( ) ;
void stampa_persone_codice_indirizzo ( ) ;
void inserimento_numero_telefono ( ) ;
void  ricerca_numero_telefono ( ) ;
void cancellazione_numero_telefono ( ) ;
void modifica_numero_telefono ( ) ;
void stampa_persone_telefono ( ) ;
void recupera_num_telefono (int codice_persona , telefono T[ ] , int
n_telefoni , int *num_telef , char commento[ ] ) ;
/* Array di strutture : le tabelle inizialmente sono vuote */
persona  P [DIM] ;
telefono T [DIM] ;
/* Qui inizia il MAIN, e quindi le variabili locali al main */
void main ( )          {
 int scelta ;
 printf ("GESTIONE DI UNA RUBRICA DI INDIRIZZI E DI NUMERI TELEFONICI.\n") ;
 printf ( "\nProgram developed by Stefano Bolognini\n" ) ;
 for ( ; ; )               /* Il ciclo prevede che finito l'uso di ogni
funzione, venga stampata ogni volta la schermata delle operazioni
disponibili,per poter utilizzare una nuova funzione; la fine viene dettata
dalla scelta dell'user ( se digita 0,il programma finisce ) */
  /* Menù delle operazioni disponibili nel programma */
 {
  printf ("\nOperazioni disponibili :\n") ;
  printf ("\n1)\tInserimento dati di una nuova persona\n");
  printf ("2)\tRicerca dei dati di una persona dati il nome e il
cognome\n");
  printf ("3)\tCancellazione di una persona dato il suo codice\n");
  printf ("4)\tModifica dei dati di una persona dato il suo codice\n");
  printf ("5)\tStampa di tutte le persone con il loro codice e il loro
indirizzo\n");
  printf ("6)\tInserimento di un nuovo numero di telefono\n");
  printf ("7)\tRicerca di un numero di telefono dato nome e cognome di una
persona\n");
  printf ("8)\tCancellazione di un numero di telefono dato il codice della
persona\n");
  printf ("9)\tModifica di un numero di telefono dato il codice di una
persona\n");
  printf ("10)\tStampa di tutte le persone con i loro numeri di
telefono\n");
  printf ("0)\tFine elaborazione\n");
  printf ("\nScegliere un'operazione disponibile:  ");
  scanf  ("%d" , &scelta);
  /* Istruzione di selezione multipla per le operazioni */
  switch (scelta)
  {
  case 1 :
   inserimento_persona  ( );
   break ;
  case 2 :
   ricerca_persona  ( );
   break ;
  case 3 :
   cancellazione_persona  ( );
   break ;
  case 4 :
   modifica_persona  ( );
   break ;
  case 5 :
   stampa_persone_codice_indirizzo  ( );
   break ;
  case 6 :
   inserimento_numero_telefono  ( );
   break ;
  case 7 :
   ricerca_numero_telefono  ( );
   break ;
  case 8 :
   cancellazione_numero_telefono  ( );
   break ;
  case 9 :
   modifica_numero_telefono  ( );
   break ;
  case 10 :
   stampa_persone_telefono  ( );
   break ;
  case 0 :
   exit (1) ;
  }
 }
}
/* Definizioni delle funzioni utilizzate nel programma */
void inserimento_persona ( )       {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "a") ) == NULL)   {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 persona bufpers ;     /* Variabile di memoria temporanea dove conservare i
dati momentaneamente */
 printf ( "\nDigitare codice,cognome,nome e indirizzo della persona da
inserire separati da  newline\n" ) ;
 scanf ( "%d\n%s\n%s\n" , &bufpers.codice_persona , bufpers.cognome ,
bufpers.nome ) ;
 gets ( bufpers.indirizzo ) ;
 fprintf ( fp1 , "%d %s %s %s\n" , bufpers.codice_persona , bufpers.cognome
, bufpers.nome , bufpers.indirizzo ) ;
 printf ( "\nPersona inserita\n" ) ;
 fclose ( fp1 ) ;
 return ;
}
void ricerca_persona ( )             {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 char  C [50] ;
 char  N[50] ;
 int tr=1 ;
 for ( i=0 ; i<DIM ; i++ )  {     /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture ,
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp1 , "%d %s %s " , &P[i].codice_persona , P[i].cognome ,
P[i].nome ) ;
  fgets ( P[i].indirizzo , DIM , fp1 ) ;
 }
 printf ( "\nDigitare cognome e nome della persona separati da un
newline\n" ) ;
 scanf ( "%s\n%s" , C , N ) ;
 for ( i=0 ; i<DIM ; i++ )  {
  if ( strcmp(P[i].cognome , C)==0 && strcmp(P[i].nome , N)==0)  {
   printf ( "\nI dati mancanti della persona sono :\n%d\n%s\n" ,
P[i].codice_persona , P[i].indirizzo );
   tr=0 ;
  }
 }
 if (tr == 1)  printf ( "\nDati inseriti inesistenti\n" ) ;
 fclose ( fp1 ) ;
 return ;
}
void cancellazione_persona ( )            {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r+" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int j ;
 int codice ;
 int tr=1 ;
 printf ( "\nDigitare il codice della persona da cancellare\n" ) ;
 scanf ( "%d" , &codice ) ;
 for ( i=0 ; i<DIM ; i++ )     {
  if ( P[i].codice_persona == codice )  {
   j=i ;
   while(P[i].codice_persona >= 0 && j < DIM)
   {
    P[j] = P[j+1] ;
    j++;
   }
   P[j].codice_persona = -1;    /* invalidazione dell'ultimo dato */
   printf ( "\nPersona cancellata\n" ) ;
   tr=0 ;
  }
 }
 for ( i=0 ; i<DIM ; i++ )
  fprintf ( fp1 , "%d %s %s %s\n" , P[i].codice_persona , P[i].cognome ,
P[i].nome , P[i].indirizzo ) ;
 if (tr == 1)  printf ( "\nDato inserito inesistente\n" ) ;
 /* Per la cancellazione, si toglie fisicamente la cella contenente quella
struttura dall'array, rimettendo tutte le altre strutture in un altro
vettore, saltando quella determinata cella, invalidando l'ultimo elemento,
assegnandogli un valore negativo  */
 fclose ( fp1 ) ;
 return ;
}
void modifica_persona ( )             {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r+" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int codice ;
 int cod ;
 char NOME[50] ;
 char COGNOME[50] ;
 char INDIRIZZO[100];
 int tr=1 ;
 printf ( "\nDigitare il codice della persona da modificare\n" ) ;
 scanf ( "%d" , &codice ) ;
 for ( i=0 ; i<DIM ; i++ )  {
  if ( P[i].codice_persona == codice )  {
   printf ( "\nDigitare codice, cognome, nome e indirizzo separati da un
newline\n" ) ;
   scanf ( "%d\n%s\n%s\n" , &cod , COGNOME , NOME ) ;
   gets ( INDIRIZZO ) ;
   P[i].codice_persona=cod ;
   strcpy ( P[i].cognome , COGNOME ) ;
   strcpy ( P[i].nome , NOME ) ;
   strcpy ( P[i].indirizzo , INDIRIZZO ) ;
   fprintf ( fp1 , "%d %s %s %s\n" , P[i].codice_persona , P[i].cognome ,
P[i].nome , P[i].indirizzo ) ;
   printf ( "\nPersona modificata\n" ) ;
   tr=0 ;
  }
 }
 if (tr == 1)  printf ( "\nDati inseriti inesistenti\n" ) ;
 fclose ( fp1 ) ;
 return ;
}
void stampa_persone_codice_indirizzo ( )       {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 for ( i=0 ; i<DIM ; i++ )  {     /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture ,
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp1 , "%d %s %s " , &P[i].codice_persona , P[i].cognome ,
P[i].nome ) ;
  fgets ( P[i].indirizzo , DIM , fp1 ) ;
 }
 printf ( "\nDigitare INVIO per stampare ogni nuova persona,o Ctrl+z (EOF)
per terminare\n\n" ) ;
 for ( i=0 ; i<DIM ; i++ )       {
  if ( getchar()=='\n' )     {
   printf ( "%d\n%s\n%s\n%s" , P[i].codice_persona , P[i].cognome ,
P[i].nome , P[i].indirizzo ) ;
  }
  else if (getchar()==EOF) return ;
 }
 fclose ( fp1 ) ;
 return ;
}
void inserimento_numero_telefono ( )            {
 FILE  *fp2 ;
 if ( ( fp2 = fopen ( "telefoni.txt" , "a" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 telefono buftelef ;     /* Variabile di memoria temporanea dove conservare
i dati momentaneamente */
 printf ( "\nDigitare il codice,il numero di telefono e il commento separati
da un newline\n" ) ;
 scanf ( "%d\n%d\n" , &buftelef.codice_persona , &buftelef.numero_telefono )
;
 gets ( buftelef.commento ) ;
 fprintf ( fp2 , "%d %d %s\n" , buftelef.codice_persona ,
buftelef.numero_telefono , buftelef.commento ) ;
 printf ( "\nTelefono inserito\n" ) ;
 fclose ( fp2 ) ;
 return ;
}
/* La seguente procedura permette connettere i due record (le due
strutture), perché vagliando uno ad uno tutti i Telefoni ne bufferizza in
memoria il numero e il commento; dunque passando un determinato codice di
persona proveniente dal record Persone, la procedura provvederà a trovare
quel determinato codice nei Telefoni, recuperando i due parametri -
procedura,quindi passati per indirizzo - proprio dal secondo record */
void recupera_num_telefono ( int codice_persona , telefono T[ ] , int
n_persone , int *num_telef , char commento [ ] )
{
 int i ;
 for ( i=0 ; i< n_persone ; i++ )  {
  if ( P[i].codice_persona == codice_persona )  {
   *num_telef = T[i].numero_telefono ;
   strcpy (commento , T[i].commento ) ;
  }
 }
}
void ricerca_numero_telefono ( )                {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 FILE  *fp2 ;
 if ( ( fp2 = fopen ( "telefoni.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int j ;
 char C[50] ;
 char N[50] ;
 int numero_telefono ;
 char commento[50] ;
 int tr=1 ;
 for ( i=0 ; i<DIM ; i++ )  {     /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture ,
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp1 , "%d %s %s " , &P[i].codice_persona , P[i].cognome ,
P[i].nome ) ;
  fgets ( P[i].indirizzo , DIM , fp1 ) ;
 }
 for ( j=0 ; j<DIM ; j++ )  {      /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp2 , "%d %d " , &T[j].codice_persona , &T[j].numero_telefono ) ;
  fgets ( T[j].commento , DIM , fp2 ) ;
 }
 printf ( "\nDigitare cognome e nome della persona separati da un
newline\n" ) ;
 scanf ( "%s\n%s" , C , N ) ;
 for ( i=0 ; i< DIM ; i++ )  {
  if ( P[i].cognome == C  &&  P[i].nome == N )  {
   for ( j=i ; j< DIM ; j++ )  {       /* Chiamata alla procedura, per ogni
i (codice persona di Persona), vaglia con un nuovo ciclo for per ogni j
(codice persona di Telefoni )  il codice, recuperando il numero e il
commento */
    recupera_num_telefono ( P[i].codice_persona , T , DIM , &numero_telefono
, commento ) ;
    printf ( "\nIl numero di telefono e il commento sono : %d  %s\n" ,
numero_telefono , commento ) ;
    tr=0 ;
   }
  }
 }
 if (tr == 1)  printf ( "\nDato inserito inesistente\n" ) ;
 fclose ( fp1 ) ;
 fclose ( fp2 ) ;
 return ;
}
void cancellazione_numero_telefono ( )                {
 FILE  *fp2 ;
 if ( ( fp2 = fopen ( "telefoni.txt" , "r+" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int j ;
 int codice ;
 int tr=1 ;
 printf ( "\nDigitare il codice della persona riferita al telefono\n" ) ;
 scanf ( "%d" , &codice ) ;
 for ( i=0 ; i<DIM ; i++ )     {
  if ( T[i].codice_persona == codice )  {
   j=i ;
   while(T[i].codice_persona >= 0 && j < DIM)
   {
    T[j] = T[j+1] ;
    j++;
   }
   T[j].codice_persona = -1;    /* invalidazione dell'ultimo dato */
   printf ( "\nTelefono cancellato\n" ) ;
   tr=0 ;
  }
 }
 if (tr == 1)  printf ( "\nDato inserito inesistente\n" ) ;
 /* Per la cancellazione, si toglie fisicamente la cella contenente quella
struttura dall'array, rimettendo tutte le altre strutture in un altro
vettore, saltando quella determinata cella, invalidando l'ultimo elemento,
assegnandogli un valore negativo  */
 fclose ( fp2 ) ;
 return ;
}
void modifica_numero_telefono ( )             {
 FILE  *fp2 ;
 if ( ( fp2 = fopen ( "telefoni.txt" , "r+" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int codice ;
 int cod ;
 int num ;
 char COMMENTO[50] ;
 int tr=1 ;
 printf ( "\nDigitare il codice della persona da modificare\n" ) ;
 scanf ( "%d" , &codice ) ;
 for ( i=0 ; i<DIM ; i++ )  {
  if ( T[i].codice_persona == codice )  {
   printf ( "\nDigitare codice, numero di telefono e commento separati da un
newline\n" ) ;
   scanf ( "%d\n%d\n" , &cod , &num  ) ;
   gets ( COMMENTO ) ;
   T[i].codice_persona=cod ;
   T[i].numero_telefono=num ;
   strcpy ( T[i].commento , COMMENTO ) ;
   fprintf ( fp2 , "%d %d %s\n" , T[i].codice_persona , T[i].numero_telefono
, T[i].commento ) ;
   printf ( "\nTelefono modificato\n" ) ;
   tr=0 ;
  }
 }
 if (tr == 1)  printf ( "\nDato inserito inesistente\n" ) ;
 fclose ( fp2 ) ;
 return ;
}
void  stampa_persone_telefono ( )                {
 FILE  *fp1 ;
 if ( ( fp1 = fopen ( "persone.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 FILE  *fp2 ;
 if ( ( fp2 = fopen ( "telefoni.txt" , "r" ) ) == NULL)  {
  printf ("\nImpossibile aprire il file\n") ;
  exit (1) ;
 }
 int i ;
 int j ;
 char ch ;
 int numero_telefono ;
 char commento[50] ;
 for ( i=0 ; i<DIM ; i++ )  {     /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture ,
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp1 , "%d %s %s " , &P[i].codice_persona , P[i].cognome ,
P[i].nome ) ;
  fgets ( P[i].indirizzo , DIM , fp1 ) ;
 }
 for ( j=0 ; j<DIM ; j++ )  {      /* Per tale funzione si leggono tutti i
dati dal file, inserendoli in un vettore di strutture ,
bufferizzandoli dunque in memoria , e poi si gestisce il vettore stesso */
  fscanf ( fp2 , "%d %d " , &T[j].codice_persona , &T[j].numero_telefono ) ;
  fgets ( T[j].commento , DIM , fp2 ) ;
 }
 printf ( "\nDigitare INVIO per stampare ogni persona con il relativo numero
di telefono\n" ) ;
 for ( i=0 ; i<DIM ; i++ )  {
  for ( j=i ; j<DIM ; j++ )  {             /* Chiamata alla procedura, per
ogni i (codice persona di Persona), vaglia con un nuovo ciclo for per ogni j
(codice persona di Telefoni ) il codice, recuperando il numero e il commento
*/
   recupera_num_telefono ( P[j].codice_persona , T , DIM , &numero_telefono
, commento ) ;
  }
  if ( getchar()=='\n' )  {
   printf ( "\n%d\n%s\n%s\n%d\n%s\n" , P[i].codice_persona ,  P[i].cognome ,
P[i].nome ,  numero_telefono , commento , P[i].indirizzo );
  }
  else if (getchar()==EOF) return ;
 }
 fclose ( fp1 ) ;
 fclose ( fp2 ) ;
 return ;
}

 int, ovviamente lo 0 davanti non ha nessun senso...
Quindi il bun senso avrebbe dovuto suggerirti di memorizzare il numero
di telefono in un altro formato :-)
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 traslata in \n e buonanotte.
Ehm....e quindi? :-)

 int, ovviamente lo 0 davanti non ha nessun senso...
E' fondamentalmente sbagliato memorizzare un numero di telefono come intero.
Un numero di telefono e' comunque e sempre un testo (anche perche', in molti
casi, si puo' comprendere dei caratteri speciali come *, # o la virgola).
Appena ho un po' di tempo ti posto un esempio.
--------------------------------
Inviato via 
http://usenet.libero.it

 Ehm....e quindi? :-)
dai è troppo facile , se vuoi continuare a lavorare in file di testo devi
cambiare la codifica del codice e del numero di telefono
oppure salvi e leggi in binario (ma non te lo consiglio richiederebbe una
gestione più complessa)

 Appena ho un po' di tempo ti posto un esempio.
Grazie ;-)

> > Ehm....e quindi? :-)
usa una stringa, ovvero un array di char... tipo   char num_tel [xx]; 
Ciao
Daniele