Problema con gli archivi in c

di il
5 risposte

Problema con gli archivi in c

Salve a tutti sono un nuovo utente, vi espongo subito un mio problema: ho compilato questo programma che apparentemente funziona, pecchato che quando inserisco i dati della seconda persona e ricerco la prima non trovo la persona precedentemente inserita, qualcuno potrebbe aiutarmi?
grazie

//voglio scrivere un archivio in cui inserisco un sottoprogramma di creazione, uno di inserimento e uno di ricerca

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


struct nom
{
char cogn[35];
char nom[30];
char ind[40];
char tel[20];
};


struct nom am;


//creazione che non funziona
void crea(void)
{
FILE *f;
char m;
f=fopen("c:\\in_c\\archivio.dat","wb");
if(f==NULL)
f=fopen("c:\\in_c\\archivio.dat","wb");
else
{
printf("Il file esiste, lo vuoi sostituire? s/n");
scanf("%s",m);
if(m=='s')
f=fopen("c:\\in_c\\archivio.dat","wb");
}
fclose(f);
};



//inserimento persona
void ins_per(void)
{
FILE *f;
f=fopen("c:\\in_c\\archivio.dat","a");
printf("Inserisci un cognome: ");
scanf("%s",am.cogn);
printf("\nInserisci un nome: ");
scanf("%s",am.nom);
printf("\nInserisci un indirizzo: ");
scanf("%s",am.ind);
printf("\nInserisci un numero telefonico: ");
scanf("%s",am.tel);
fwrite(&am,sizeof(struct nom),1,f);
fclose(f);
};


//ricerca persona
void ric_per(void)
{
int r,t,m;
char cogn[35];
char nome[30];
FILE *f;
f=fopen("c:\\in_c\\archivio.dat","a+");
printf("Digita il cognome della persona: ");
scanf("%s",cogn);
m=fread(&am,sizeof(struct nom),1,f);
do
{
r=strcmp(am.cogn,cogn);
if(r==0)
{
printf("\nDigita il nome della persona: ");
scanf("%s",nome);
m=fread(&am,sizeof(struct nom),1,f);
t=strcmp(am.nom,nome);
if(t==0)
{
printf("\nDati della persona\n\n");
printf("\nCognome: %s",am.cogn);
printf("\nNome: %s",am.nom);
printf("\nIndirizzo: %s",am.ind);
printf("\nNumero telefonico: %s\n",am.tel);
getch();
break;

}
}
m=fread(&am,sizeof(struct nom),1,f);
}
while(m!=0);
fclose(f);
};


void main(void)
{
int g;
do
{
clrscr();
printf("-------------------------------------------------------------------------------\n");
printf("\n BENVENUTI IN QUESTO PROGRAMMA FANTASTICO\n\n");
printf("Digita 1 se vuoi creare un archivio\n");
printf("Digita 2 se vuoi inserire una persona nell'archivio\n");
printf("Digita 3 se vuoi ricercare una persona nell'archivio\n");
printf("digita 4 se vuoi uscire dal programma\n");
printf("-------------------------------------------------------------------------------\n");
scanf("%d",&g);
if(g==1)
crea();
if(g==2)
ins_per();
if(g==3)
ric_per();
if(g==4)
break;
}
while(1);
}

5 Risposte

  • Re: Problema con gli archivi in c

    Prova a modificare la funzione crea così:
    
    void crea(void){
        FILE *f;
        char m;
        f=fopen("archivio.dat","ab");
        if(f==NULL)
        {   
            fclose(f);
            f=fopen("archivio.dat","wb");
        }else{
            printf("Il file esiste, lo vuoi sostituire? s/n");
            fflush(stdin);
            scanf("%c",&m);
            if(m=='s')
            {
               fclose(f);
               f=fopen("archivio.dat","wb");
            }
        }
        fclose(f);
    }
    
    Un consiglio per la ricerca: elimina la seconda lettura dal file altrimenti ti va a leggere il "record" successivo
    
    void ric_per(void)
    {
        int r,t,m;
        char cogn[35];
        char nome[30];
        FILE *f;
        f=fopen("archivio.dat","a+");
        printf("Digita il cognome della persona: ");
        scanf("%s",cogn);
        m=fread(&am,sizeof(struct nom),1,f);
        do
        {
            r=strcmp(am.cogn,cogn);
            if(r==0)
            {
                printf("\nDigita il nome della persona: ");
                scanf("%s",nome);
                //m=fread(&am,sizeof(struct nom),1,f);
                t=strcmp(am.nom,nome);
                if(t==0)
                {
                    printf("\nDati della persona\n\n");
                    printf("\nCognome: %s",am.cogn);
                    printf("\nNome: %s",am.nom);
                    printf("\nIndirizzo: %s",am.ind);
                    printf("\nNumero telefonico: %s\n",am.tel);
                    getch();
                    break;
                }
            }
            m=fread(&am,sizeof(struct nom),1,f);
        }
        while(m!=0);
        fclose(f);
    }
    
  • Re: Problema con gli archivi in c

    Miticissimo grazie mille ora funzione bene. Unica pecca è che se inserisco 3 cognomi uguali mi chiede se cerco il 3° cognome inserito 3 volte il nome
    grazie ancora
  • Re: Problema con gli archivi in c

    
    ---cut---
    f=fopen("archivio.dat","ab");
        if(f==NULL)
        {   
            fclose(f); // ???? <---
            f=fop
    ---cut---
    
    Un'altra cosuccia non gradita:
    flush(stdin);

    ~Max
  • Re: Problema con gli archivi in c

    Scusami ma non ho capito cosa vuoi intendere
  • Re: Problema con gli archivi in c

    Grazie a tutti ora funziona perfettamente!!!
Devi accedere o registrarti per scrivere nel forum
5 risposte