Stef3k
05-07-2002, 14:13
Salve,avrei un problemino con delle procedure e array di strutture...
Il programma consta nella gestione di una Rubrica di persone e numeri di telefono. Io l'ho fatto utilizzando solamente Array di strutture e non liste(nn le abbiamo ancora fatte).
Il programma presenta una menu' di scelta fra varie funzioni (inserimento di persone\cancellazione\mofifica\stampa),e elabora due file testuali (fp1 per le persone->vettore di strutture e fp2 per i telefoni->altro vettore di strutture).
Ogni funzione disponibile l'ho creata tramite una procedura e per ognuna:
-prima vengono letti i dati dal file (ciclo for per la bufferizzazione,cioe' memorizz)
-poi descrivo le operazioni che voglio a seconda della funzione (cicli for per la ricerca\confronto,ecc).
Il problema è questo : nella modifica di una persona (cioe' di una cella i-esima del vettore di strutture),non mi modifica quella cella,ma me la aggiunge alla fine del file.....
stessa cosa per la cancellazione,anche se (apertura del file tramite "r+") dopo la bufferizzazione tutti i campi vengono azzerati prima di fare le operazioni.....
Se qc di voi mi dice come si fa ad ovviare al problema...Grazie
queste sono le procedure:
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 ;
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 il codice della persona da cancellare\n” ) ;
scanf ( “%d“ , &codice ) ;
for ( i=0 ; i<DIM ; i++ ) {
if ( P[i].codice_persona == codice ) { /*ciclo di confronto*/
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 ;
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 il codice della persona da modificare\n” ) ;
scanf ( “%d“ , &codice ) ;
for ( i=0 ; i<DIM ; i++ ) {
if ( P[i].codice_persona == codice ) { /*ciclo di confronto*/
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 ; }
Il programma consta nella gestione di una Rubrica di persone e numeri di telefono. Io l'ho fatto utilizzando solamente Array di strutture e non liste(nn le abbiamo ancora fatte).
Il programma presenta una menu' di scelta fra varie funzioni (inserimento di persone\cancellazione\mofifica\stampa),e elabora due file testuali (fp1 per le persone->vettore di strutture e fp2 per i telefoni->altro vettore di strutture).
Ogni funzione disponibile l'ho creata tramite una procedura e per ognuna:
-prima vengono letti i dati dal file (ciclo for per la bufferizzazione,cioe' memorizz)
-poi descrivo le operazioni che voglio a seconda della funzione (cicli for per la ricerca\confronto,ecc).
Il problema è questo : nella modifica di una persona (cioe' di una cella i-esima del vettore di strutture),non mi modifica quella cella,ma me la aggiunge alla fine del file.....
stessa cosa per la cancellazione,anche se (apertura del file tramite "r+") dopo la bufferizzazione tutti i campi vengono azzerati prima di fare le operazioni.....
Se qc di voi mi dice come si fa ad ovviare al problema...Grazie
queste sono le procedure:
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 ;
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 il codice della persona da cancellare\n” ) ;
scanf ( “%d“ , &codice ) ;
for ( i=0 ; i<DIM ; i++ ) {
if ( P[i].codice_persona == codice ) { /*ciclo di confronto*/
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 ;
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 il codice della persona da modificare\n” ) ;
scanf ( “%d“ , &codice ) ;
for ( i=0 ; i<DIM ; i++ ) {
if ( P[i].codice_persona == codice ) { /*ciclo di confronto*/
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 ; }