Newsgroup: it.comp.lang.c
Titolo: Database in C

Salve a tutto il NG e scusate la domanda credo banale :-). Vorrei avere
alcune informazioni su come gestire i database in C (uso il gcc in linux).
Come faccio a salvare le informazioni immesse su di un file, e, dopo,
andarle a  ripescare in un altro programma??? La mia idea era quella di
costruire una semplice rubrica che memorizzasse i dati immessi su di un
file.
Aiutatemi Grazie!!!
Marco
P.S. Se il messaggio si legge male avvertitemi che non so impostare il
programma di posta!!!

file.
Ho pensato di scriverti lo scheletro di un programma base.
Ovviamente, sono a tua disposizione per tutti i chiarimenti del caso :
/***********************************************
 * RUBRICA.C  
 * --------------------------------------------
 * Gestione di una piccola rubrica di contatti.
 ***********************************************/
#include <stdio.h>
#include <string.h>
typedef enum { FALSO, VERO } flag  ;
typedef struct {
                 flag cancellato ;
                 char nome      [20] ;
                 char cognome   [30] ;
                 char indirizzo [50] ;
                 char telefono  [20] ;
               } tipo_contatto ;
static char leggi_car( void ) ;
static void leggi_stringa( char *, unsigned ) ;
static void chiedi_contatto( tipo_contatto * ) ;
static void visualizza_contatto( tipo_contatto ) ;
static void inserimento_nuovo_contatto( void ) ;
static void modifica_contatto( void ) ;
static void visualizzazione_contatti( void ) ;
static FILE * rubrica ;
char leggi_car()
{
    int c = getchar() ;
    if ( c != '\n' ) while ( getchar() != '\n' ) ;
    return c ;
}
void leggi_stringa( char * s, unsigned l )
{
     fgets( s, l, stdin ) ;
     s [strlen( s )-1] = '\0' ;
}
void chiedi_contatto( tipo_contatto * Cp )
{
     puts( "\nRichiesta contatto :\n " ) ;
     printf( "Nome......: " ) ;
     leggi_stringa( Cp->nome, sizeof Cp->nome ) ;
     printf( "Cognome...: " ) ;
     leggi_stringa( Cp->cognome, sizeof Cp->cognome ) ;
     printf( "Indirizzo.: " ) ;
     leggi_stringa( Cp->indirizzo, sizeof Cp->indirizzo ) ;
     printf( "Telefono..: " ) ;
     leggi_stringa( Cp->telefono, sizeof Cp->telefono ) ;
     Cp->cancellato = FALSO ;
}
void visualizza_contatto( tipo_contatto C )
{
     printf ( "\nNome......: %s\n", C.nome ) ;
     printf ( "Cognome...: %s\n", C.cognome ) ;
     printf ( "Indirizzo.: %s\n", C.indirizzo ) ;
     printf ( "Telefono..: %s\n", C.telefono ) ;
     printf ( "-----------\n" ) ;
}
void inserimento_nuovo_contatto()
{
     tipo_contatto C ;
     chiedi_contatto( &C ) ;
     fseek( rubrica, 0L, SEEK_END ) ;
     fwrite( &C, sizeof C, 1, rubrica ) ;
}
void modifica_contatto()
{
     tipo_contatto C ;
     int r ;
     unsigned long pos = 0L ;
     while ( fread ( &C, sizeof C, 1, rubrica ) )
           if ( C.cancellato == FALSO )
           {
                 visualizza_contatto ( C ) ;
                 printf ( "\nda modificare (s/n) ?" ) ;
                 r = leggi_car() ;
                 if ( r == 's' )
                 {
                    printf ("\nda cancellare (s/n) ?" ) ;
                    r = leggi_car() ;
                    if ( r == 's' )
                       C.cancellato = VERO ;
                    else
                       chiedi_contatto( &C ) ;
                    fseek( rubrica, pos, SEEK_SET ) ;
                    fwrite( &C, sizeof C, 1, rubrica ) ;
                    break ;
                 }
                 pos += sizeof C ;
           }
}
void visualizzazione_contatti()
{
     tipo_contatto C ;
     while ( fread ( &C, sizeof C, 1, rubrica ) )
           if ( C.cancellato == FALSO )
           {
              visualizza_contatto ( C ) ;
              printf ( "premi INVIO per continuare...\n" ) ;
              leggi_car() ;
           }
}
int main()
{
    char r ;
    if ( ( rubrica = fopen ( "rubrica.dat", "r+b" ) ) == NULL )
    {
       puts( "\aArchivio inesistente...costruzione in corso..." ) ;
       rubrica = fopen ( "rubrica.dat", "w+b" ) ;
    }
    do
    {
       puts( "\nGestione di una rubrica - Menu principale" ) ;
       puts( "-------------------------------------------\n" ) ;
       puts( "Scegli l'operazione da compiere :\n" ) ;
       puts( "  1 - Inserimento Nuovo Contatto" ) ;
       puts( "  2 - Modifica/Cancellazione Contatto" ) ;
       puts( "  3 - Visualizzazione Contatti" ) ;
       puts( "  9 - Uscita\n" ) ;
       printf ( ">" ) ; r = leggi_car() ;
       switch ( r )
       {
            case '1' : inserimento_nuovo_contatto() ;
                     rewind ( rubrica ) ;
                     break ;
            case '2' : modifica_contatto() ;
                     rewind ( rubrica ) ;
                     break ;
            case '3' : visualizzazione_contatti() ;
                     rewind ( rubrica ) ;
                     break ;
       }
    } while ( r != '9' ) ;
    fclose( rubrica ) ;
    return 0 ;
}