File binario

di il
1 risposte

File binario

Salve, qualcuno può aiutarmi a capire perché non mi funziona la ricerca e la modifica nel mio programma, grazie:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{//definizione della struct studente
    char nome[20];
    char cognome[20];
    char data[20];
}studente;

void main(){
    FILE *f1;
    int scelta, i;
    int nl=0; //serve per contare quanti studenti ci sono
    char Tdata[20]; //data da trovare
    char Tnome[30]; //nome da trovare
    do{
        fflush(stdin);
        //menu'
        printf("MENU'\n");
        printf("1)Inserisci dati\n");
        printf("2)Stampa dati\n");
        printf("3)Ricerca\n");
        printf("4)Modifica studente\n");
        printf("\nEffettua una scelta valida: ");
        scanf("%d", &scelta);
        while(scelta<1||scelta>5){
            printf("\nErrore! Scelta selezionata non valida: ");
            scanf("%d", &scelta);
        }
        switch(scelta){
            case 1://inserimento dei dati
                system("CLS");
                f1=fopen("elenco.dat", "a+");
                studente x;
                printf("Inserire il nome:\n");
                scanf("%s", &x.nome);
                fflush(stdin);
                printf("Inserire cognome:\n");
                scanf("%s", &x.cognome);
                fflush(stdin);
                printf("Inserire la data di nascita (es 12.12.2021): \n");
                scanf("%s", &x.data);
                fflush(stdin);
                fwrite(&x, sizeof(studente), 1, f1);
                fclose(f1);
                break;
            case 2://stampa dei dati
                system("CLS");
                f1=fopen("elenco.dat", "r");
                printf("Elenco di tutti gli studenti: \n \n");
                while(!feof(f1)){
                        if(fread(&x, sizeof(studente), 1, f1)!=0){
                            printf("Nome: %s \n", x.nome);
                            printf("Cognome: %s \n", x.cognome);
                            printf("Data di nascita: %s \n", x.data);
                            printf("\n");
                        }
                }
                fclose(f1);
                break;
            case 3://ricerca all'interno del file
                system("CLS");
                f1=fopen("elenco.dat", "r+b");
                rewind(f1);//mi porta all'inizio del file
                while(fread(&x, sizeof(studente), 1, f1)==1){//ciclo che conta gli studenti presenti nel file
                    nl++;
                }
                printf("Inserire la data da cercare: ");
                scanf("%s", &Tdata);
                rewind(f1);
                for(i=0; i<nl; i++){
                    fread(&x, sizeof(studente), 1, f1);
                    if(strcmp(x.data, Tdata)==0){
                        printf("Data trovata! \n");
                        printf("Nome: %s \n", x.nome);
                        printf("Cognome: %s \n \n", x.cognome);
                    break;
                    }
                    else
                        printf("Data non trovata \n");
                }
                fclose(f1);
                break;
            case 4://modifica dei dati
                system("CLS");
                f1=fopen("elenco.dat", "a+");
                rewind(f1);
                while(fread(&x, sizeof(studente), 1, f1)==1){
                    nl++;
                }
                printf("Inserire lo studente da modificare: ");
                scanf("%s", &Tnome);
                rewind(f1);
                for(i=0; i<nl; i++){
                    fread(&x, sizeof(studente), 1, f1);
                    if(strcmp(x.nome, Tnome)==0){
                        printf("Inserire in nuovo nome:");
                        scanf("%s \n", x.nome);
                        fflush(stdin);
                        printf("Inserire in nuovo Cognome:");
                        scanf("%s \n", x.cognome);
                        fflush(stdin);
                        printf("Inserire la nuova data:");
                        scanf("%s \n", x.data);
                        fflush(stdin);
                    break;
                    }
                    else
                        printf("Inserire un nome valido ! \n \n");
                }
                fclose(f1);
                break;
            default:
                break;
        }
    }while(scelta!=5);
    system("PAUSE");
}

1 Risposte

  • Re: File binario

    Non usi b in alcune fopen

    La feof non va usata con i file binari, controlla il valore restituito da fread
Devi accedere o registrarti per scrivere nel forum
1 risposte