danixxx89
18-07-2009, 21:30
#include <stdio.h>
#include <stdlib.h>
#define MINSIZE 26
#define SIZE 50
#define MAXSIZE 100
struct persone {
int num_cont_corrente;
char nome[MINSIZE];
char cognome[MINSIZE];
double conto_attuale;
double conto_precedente;
double deposito;
double prelievo;
};
int menu( void );
FILE* crea_file();
void leggi_info( FILE *fptr );
void inserisci_nuova_info( FILE *fptr );
void modifica_info( FILE *fptr );
int main ()
{
FILE *fptr;
int c;
while ( ( c = menu() ) != 0 ){
switch ( c ) {
case 1:
fptr = crea_file();
break;
case 2:
leggi_info( &fptr );
break;
case 3:
inserisci_nuova_info( &fptr );
break;
case 4:
modifica_info( &fptr );
break;
default:
printf( "\nCarattere inserito non corretto.\n"
"Prego inserire un nuovo carattere\n" );
break;
}
}
fclose( fptr );
system ( "pause" );
return 0;
}
int menu( void )
{
int c;
printf( "Digitare il numero corrispettivo per le seguenti funzioni:\n\n"
"0) Esci dal programma\n"
"1) Crea il file di testo (cliente.dat)\n"
"2) Leggi info clienti\n"
"3) Inserisci nuove info-clienti\n"
"4) Modifica info-clienti\n"
scanf( "%d", &c );
return c;
}
FILE* crea_file()
{
FILE *fptr;
int i;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "wb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}
else {
for( i = 1; i <= MAXSIZE; i++){
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
}
}
return fptr;
}
void leggi_info( FILE *fptr )
{
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "%-15s%-15s%-10s%10s%10s\n", "NOME", "COGNOME",
"CONTO ATTUALE", "ENTRATE", "USCITE");
while( !feof ( fptr ) ){
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente != 0 ) {
printf( "%-15s%-15s%-10.2f%10.2f%11.2f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
}
}
}
fclose(fptr);
return;
}
void inserisci_nuova_info( FILE *fptr )
{
int cc;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "\nInserire il cod. di conto corrente: \n" );
scanf( "\n%d", &cc );
fseek( fptr, ( cc - 1 ) * sizeof( cliente ), SEEK_SET );
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente != 0 )
{
printf( "\nIl numero di conto corrente %d e' gia' esistente."
"\n\n", cc );
} else {
printf( "\nInserire Nome, Cognome, Saldo in bilancio\n"
"( Dopo ogni campo premere INVIO ): \n" );
scanf( "%s\n%s\n%f", cliente.nome, cliente.cognome,
&cliente.conto_attuale );
}
cliente.num_cont_corrente = cc;
fseek( fptr, ( cliente.num_cont_corrente - 1 ) *
sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
}
fclose(fptr);
return;
}
void modifica_info( FILE *fptr )
{
char s;
int cc;
double aggiornamento_conto = 0.0;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "\nInserire numero di conto corrente: \n" );
scanf( "%d", &cc );
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente == 0 ) {
printf( "\nIl numero di conto corrente %d inserito non esiste."
"\n\n\n", cc );
} else {
printf( "%-15s%-15s%-10f%-10f%-10f", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
printf( "\nDigitare il segno + per le entrate, oppure"
"digitare il segno - per le uscite\n" );
scanf("%s", &s);
switch( s ){
case '+':
printf( "\nInserire la cifra da depositare:\n");
scanf( "%f", &aggiornamento_conto );
cliente.deposito += aggiornamento_conto;
cliente.conto_attuale += aggiornamento_conto;
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
printf( "%-15s%-15s%-10f%-10f%-10f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
break;
case '-':
printf( "\nInserire la cifra da prelevare:\n" );
scanf( "%f", &aggiornamento_conto );
cliente.prelievo -= aggiornamento_conto;
cliente.conto_attuale -= aggiornamento_conto;
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
printf( "%-15s%-15s%-10f%-10f%-10f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
break;
default:
printf("\nCarattere inserito non corretto\n\n");
break;
}
}
}
return;
}
Mi aiutereste per piacere a capire perchè questa funzioncina non memorizza dati in codice numerico in <cliente.conto_attuale, cliente.deposito, cliente.prelievo>. Per quanto riguarda l'inserimento di caratteri non mi da problemi invece.
#include <stdlib.h>
#define MINSIZE 26
#define SIZE 50
#define MAXSIZE 100
struct persone {
int num_cont_corrente;
char nome[MINSIZE];
char cognome[MINSIZE];
double conto_attuale;
double conto_precedente;
double deposito;
double prelievo;
};
int menu( void );
FILE* crea_file();
void leggi_info( FILE *fptr );
void inserisci_nuova_info( FILE *fptr );
void modifica_info( FILE *fptr );
int main ()
{
FILE *fptr;
int c;
while ( ( c = menu() ) != 0 ){
switch ( c ) {
case 1:
fptr = crea_file();
break;
case 2:
leggi_info( &fptr );
break;
case 3:
inserisci_nuova_info( &fptr );
break;
case 4:
modifica_info( &fptr );
break;
default:
printf( "\nCarattere inserito non corretto.\n"
"Prego inserire un nuovo carattere\n" );
break;
}
}
fclose( fptr );
system ( "pause" );
return 0;
}
int menu( void )
{
int c;
printf( "Digitare il numero corrispettivo per le seguenti funzioni:\n\n"
"0) Esci dal programma\n"
"1) Crea il file di testo (cliente.dat)\n"
"2) Leggi info clienti\n"
"3) Inserisci nuove info-clienti\n"
"4) Modifica info-clienti\n"
scanf( "%d", &c );
return c;
}
FILE* crea_file()
{
FILE *fptr;
int i;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "wb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}
else {
for( i = 1; i <= MAXSIZE; i++){
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
}
}
return fptr;
}
void leggi_info( FILE *fptr )
{
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "%-15s%-15s%-10s%10s%10s\n", "NOME", "COGNOME",
"CONTO ATTUALE", "ENTRATE", "USCITE");
while( !feof ( fptr ) ){
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente != 0 ) {
printf( "%-15s%-15s%-10.2f%10.2f%11.2f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
}
}
}
fclose(fptr);
return;
}
void inserisci_nuova_info( FILE *fptr )
{
int cc;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "\nInserire il cod. di conto corrente: \n" );
scanf( "\n%d", &cc );
fseek( fptr, ( cc - 1 ) * sizeof( cliente ), SEEK_SET );
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente != 0 )
{
printf( "\nIl numero di conto corrente %d e' gia' esistente."
"\n\n", cc );
} else {
printf( "\nInserire Nome, Cognome, Saldo in bilancio\n"
"( Dopo ogni campo premere INVIO ): \n" );
scanf( "%s\n%s\n%f", cliente.nome, cliente.cognome,
&cliente.conto_attuale );
}
cliente.num_cont_corrente = cc;
fseek( fptr, ( cliente.num_cont_corrente - 1 ) *
sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
}
fclose(fptr);
return;
}
void modifica_info( FILE *fptr )
{
char s;
int cc;
double aggiornamento_conto = 0.0;
struct persone cliente = { 0, "", "", 0.0, 0.0, 0.0, 0.0 };
if ( ( fptr = fopen( "clienti.txt", "rb+" ) ) == NULL )
{
printf( "\n\nIl file non puo' essere aperto!\n\n" );
}else {
printf( "\nInserire numero di conto corrente: \n" );
scanf( "%d", &cc );
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fread( &cliente, sizeof( struct persone ), 1, fptr );
if( cliente.num_cont_corrente == 0 ) {
printf( "\nIl numero di conto corrente %d inserito non esiste."
"\n\n\n", cc );
} else {
printf( "%-15s%-15s%-10f%-10f%-10f", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
printf( "\nDigitare il segno + per le entrate, oppure"
"digitare il segno - per le uscite\n" );
scanf("%s", &s);
switch( s ){
case '+':
printf( "\nInserire la cifra da depositare:\n");
scanf( "%f", &aggiornamento_conto );
cliente.deposito += aggiornamento_conto;
cliente.conto_attuale += aggiornamento_conto;
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
printf( "%-15s%-15s%-10f%-10f%-10f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
break;
case '-':
printf( "\nInserire la cifra da prelevare:\n" );
scanf( "%f", &aggiornamento_conto );
cliente.prelievo -= aggiornamento_conto;
cliente.conto_attuale -= aggiornamento_conto;
fseek( fptr, ( cc - 1 ) * sizeof( struct persone ), SEEK_SET );
fwrite( &cliente, sizeof( struct persone ), 1, fptr );
printf( "%-15s%-15s%-10f%-10f%-10f\n", cliente.nome,
cliente.cognome, cliente.conto_attuale,
cliente.deposito, cliente.prelievo);
break;
default:
printf("\nCarattere inserito non corretto\n\n");
break;
}
}
}
return;
}
Mi aiutereste per piacere a capire perchè questa funzioncina non memorizza dati in codice numerico in <cliente.conto_attuale, cliente.deposito, cliente.prelievo>. Per quanto riguarda l'inserimento di caratteri non mi da problemi invece.