Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] ricerche nei file

  1. #1

    [C] ricerche nei file

    Salve a tutti. Da buon principiante ho fatto il mio primo piccolo e semplice programmino:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define ELENCO 100 /* mi serve per vedere l'elenco con la scelta 2*/
    
    /* struttura di esempio */
    struct dati
    {
         int codice;
         char cognome[40];
         char nome[40];
         char cfs[17]; /*per il codice fiscale*/
         char ddn[11]; /*per la data di nascita*/
    } anagraf;
    
    int main(int argc, char *argv[])
    {
          char opfilename[] = "/home/raoul/esempio.txt"; /*per aprire il file*/
          FILE *opfp;
          struct tm *newtime; /*per scrivermi il tempo di memoriz. del record/*
           time_t aclock;
           
           int selection; /*variabile per il menù*/
    
           for( ; ; ) /*mi apro un ciclo infinito*/
           {
                       printf("\n1 - aggiunge un record");
                       printf("\n2 - visualizza elenco");
                       printf("\n3 - esci dal programma");
                       scanf("%d", &selection);
    
                       if (selection < 1 || selection > 3) /*limito la scelta al menu*/
                        {
                           printf("\nInserire solo da 1 a 3!!");
                        }
                        else if(selection == 3)
                        {
                                printf("\nArrivederci!!\n");
                                 break;
                        }
                        else if(selection == 1)
                        {
                                 printf("\nInserire codice per record: ");
                                 scanf("%d", &anagraf.codice);
                                 printf("\nInserire Cognome: ");
                                 scanf("%s", anagraf.cognome);
                                 printf("\nInserire Nome: ");
                                 scanf("%s", anagraf.nome);
                                 printf("\nInserire Codice Fiscale: ");
                                 scanf("%s", anagraf.cfs);
                                 printf("\nInserire data di nascita(gg-mm-aaa): ");
                                 scanf("%s", anagraf.ddn);
    /*mi apro il file per scriverci i dati*/
                        opfp = fopen(opfilename, "a+");
    /*metto anche il "tempo" di registrazione del record*/
                         time (&aclock);
                         newtime = localtime(&aclock);
    
    /*scrivo sul file che ho aperto*/
                         fprintf(opfp, "%d\t %s\t %s\t\t %s\t %s\t\n", anagraf.codice, anagraf.cognome, anagraf.nome, anagraf.cfs, anagraf.ddn, asctime(newtime));
    
    /*dopo aver scritto chiudo il file*/
                         fclose (opfp);
                         }/*termine dell'if per la scelta 1*/
    
                         else if( selection == 2 )
                         {
                            char ind[ELENCO];
                            opfp = fopen(rfilename, "r"); /*apro il file per leggere i record*/
                            while( !feof(opfp) )/*fin quando no arrivo alla fine del file*/
                             {
                                fgets(ind, ELENCO, opfp);
                                printf("%s", ind);
                             }
    
                             fclose(opfp);
                           }
                 }/*chiusura del ciclo for*/
    }/*fine main*/
    Ora, il suggerimento che mi servirebbe, è di crearmi un'altra funzioncina che mi permetta di fare una ricerca nel file, ad esempio di cercare per cognome o nome.

    E, l'ultima cosa, di fare un controllo che mi permetta, al momento dell'inserimento, di indicarmi se un nominativo già esiste oppure no: es.: inserisco "RaouL", se esiste già mi dovrebbe dire na cosa tipo: "Record già esistente".

    Thx. RaouL.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    14
    Senti osservando il tuo codice mi viene da chiederti se hai qualche esigenza particolare in quanto usi un file di tipo txt che sono un po' rognosi da gestire. Ti consiglio di usare un file di tipo byte cosi ti sarà più facile gestire gli inserimenti e le ricerche....

    <#include stdio.h>
    <#include conio.h>

    typedef struct{
    char nome[20];
    char cogno[20];
    char cfs[20];
    tdata data;
    }tanagrafica;
    typedef struct{
    int anno;
    int giorno;
    int mese;
    }tdata;
    FILE *fanagrafica;
    char nomecerc[20];
    char cognocerc[20];
    tanagrafica ranagrafica;//record di buffer che poi scrivero' nel file
    void cerca (void){
    fanagrafica=fopen("C:.....","rb");
    printf("Inserisci il nome da cercare..");
    gets(nomecerc);
    printf("Inserisci il cognome da cercare..");
    gets(cognocerc);
    fread(&ranagrafica,sizeof(ranagrafica),1,fanagrafi ca);
    while((!(feof(fanagrafica))&&(strcmp(ranagrafica.n ome,nomecerc=0))&&.....
    fread(&ranagrafica,sizeof(ranagrafica),1,fanagrafi ca);
    }//fine while
    if(strcmp(ranagrafica.nome,nomecerc)==0))&&(...... ..==0)){
    printf("il nome c'è");
    }else{
    printf("ilnome non c'è");
    }
    }//fine main
    //similare puo' essere il controllo x l'inserimento magari lanci un sottoprogramma che esegue il controllo.....

  3. #3
    Grazie mille per la risposta, il tuo codice ancora non l'ho provato. Per quanto riguarda la tua domanda sull'utilizzo dei file di testo, ti dico che non ho nessuna esigenza in particolare per utilizzarli, l'ho fatto solo perchè al momento non so fare altro

    Mi studio un pò iil codice da te postato e se qualcosa non mi risulta chiara torno a romperti i maroni

    Solo una piccola cosa, tu hai inserito la funzione gets(), ma da quello che leggo i più esperti dicono di evitarla come la peste perchè è a rischio di buffer overflow, in quanto non riesce a stabilire con esattezza la dimensione del buffer. Mi confermi anche tu questa cosa oppure ho capito male io?

    Thx.


    RaouL.

  4. #4
    Poi scusami, un'altra domandina, hai incluso la libreria <conio.h> ma mi pare che non sia una libreria standard. E' corretto?

  5. #5
    Originariamente inviato da RaouL_BennetH
    Poi scusami, un'altra domandina, hai incluso la libreria <conio.h> ma mi pare che non sia una libreria standard. E' corretto?
    E' corretto, nel senso che non è una libreria standard ANSI C,
    ad ogni modo dovrebbe funzionare anche senza quell'#include
    <conio.h>, visto che non usa nessuna funzione di quella
    libreria (getch() ad esempio).

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    14
    Riguardo alla libreria conio.h non è stardard la si utilizza ad esempio per la clrscr() oppure come hai scritto x la getch() io la uso quasi sempre quindi mi risulta automatico inserirla anche quando non serve.Riguardo la gets() nel tuo caso la puoi usare senza preoccupazioni in quanto devi gestire nomi e al massimo codici fiscali che sicuramente non supereranno la dimensione del buffer.
    Se hai qualche dubbio domanda pure xke l'ho scritto in quel momento come puoi notare dai ... e dal mancato rispetto dei margini.Comunque se cotinuerai a fare esercizi di questo tipo di consiglio di usare il mio metodo.

  7. #7
    Originariamente inviato da nickba
    Riguardo la gets() nel tuo caso la puoi usare senza preoccupazioni in quanto devi gestire nomi e al massimo codici fiscali che sicuramente non supereranno la dimensione del buffer.
    Se hai qualche dubbio domanda pure xke l'ho scritto in quel momento come puoi notare dai ... e dal mancato rispetto dei margini.Comunque se cotinuerai a fare esercizi di questo tipo di consiglio di usare il mio metodo.
    Intanto grazie infinite per l'attenzione, te ne sono davvero grato

    Poi, proprio per fare l'esempio con la gets(), e supponiamo che immettendo in codice fiscale, un eventuale utente lo inserisca in maniera errata tipo : ppp-ppp-ppp-ppp-ppp-pppp, aggiungendo quindi i "trattini", quei caratteri in più che mette, che tipo di problema potrebbero causare?

    E poi, da un punto di vista meramente didattico, non è più conveniente imparare ad utilizzare già da subito funzioni più sicure?

    Correggimi se dico baggianate, per voi magari sono cose banali, per me invece tutto è ancora "misterioso"

    Thx.

    RaouL.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    14
    Innanzitutto non esiste una funzione per ogni tuo problema anzi la maggior parte delle volte dei essere tu a creare funzioni che poi ti possono fare determinate operazioni..il problema dei trattini lo avresti anche nel caso in cui acquisisci la stringa con la scanf...quindi prima di tutto devi decidere come vuoi che il cliente inseririsca il codice fiscale ( con o senza trattini),salvo delle direttive che ti sono state fatte, e in base alla tua scelta in seguito sviluppi l'algoritmo più idoneo a soddisfarla...poi puo' anche essere che alcune funzioni sono state gia' sviluppate come nel caso della ricerca di un carattere all'interno di una stringa.

  9. #9
    Originariamente inviato da nickba
    Innanzitutto non esiste una funzione per ogni tuo problema anzi la maggior parte delle volte dei essere tu a creare funzioni che poi ti possono fare determinate operazioni..il problema dei trattini lo avresti anche nel caso in cui acquisisci la stringa con la scanf...quindi prima di tutto devi decidere come vuoi che il cliente inseririsca il codice fiscale ( con o senza trattini),salvo delle direttive che ti sono state fatte, e in base alla tua scelta in seguito sviluppi l'algoritmo più idoneo a soddisfarla...poi puo' anche essere che alcune funzioni sono state gia' sviluppate come nel caso della ricerca di un carattere all'interno di una stringa.
    Grazie ancora (non mi stancherò mai di ripeterlo)e, forse, credo di aver colto un prezioso suggerimento:

    credo di aver capito dalla tua risposta, che più che esistere funzioni "dannose" possono esserci più facilmente funzioni scritte male dal programmatore. Giustamente mi dici, "devi essere tu a preoccuparti che se un utente scrive "male" in un campo, di scrivere una funzione che non accetti il valore immesso ma che gli indichi di inserire il valore in formato corretto".

    Spero di aver capito il senso del tuo post. (in caso contrario ovviamente il problema è solo mio )

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    14
    ok!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.