Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    dritte su programma in C, file binario

    Ciao a tutti, io ho creato un file binario in C che contiene una sorta di rubrica caratterizzata dalla seguente struttura:

    codice:
    typedef struct{
      char nominativo[DIMN];
      char telefono[DIMT];
      char datanascita[DIMD];
      char comune[DIMC];
    }Contatto;
    ho creato una funzione che permette all'utente di inserire nuovi contatti quindi immaginatevi ora il file binario con all'intero 2 o 3 contatti inseriti dall'utente tutti caratterizzati dalla stessa struttura Contatto come sopra.

    Ora volevo chiedervi: se volessi stampare a video una specie di "rubrica" del tipo:

    Nominativo Telefono Data di nascita Comune

    nominativo1 tel1 data1 comune1
    nominativo2 tel2 data2 comune2
    nominativo3 tel3 data3 comune3

    ho fatto una funzione del genere:

    codice:
    /*
    Nome: stampa_tutto
    Descrizione: stampa la rubrica
    Input: il puntatore al file binario, gli elementi presenti in rubrica
    Output: nessuno
    */
    void stampa_tutto(FILE *fp, int n){
    
      Contatto contatto;
      char nominativo[DIMN],telefono[DIMT],datanascita[DIMD],comune[DIMC];
      int i;
      
      for(i=0;i<n;i++){
        fseek(fp,i*sizeof(contatto),SEEK_SET);
        fread(nominativo,1,DIMN,fp);
        fread(telefono,1,DIMT,fp);
        fread(datanascita,1,DIMD,fp);
        fread(comune,1,DIMC,fp);
        printf("%s   %s   %s   %s",nominativo,telefono,datanascita,comune);
      }
      printf("\n");
    return;
    }
    ma stampa cose senza senso miste a cose "semi-corrette"....sicuramente non funziona come dovrebbe.... se utilizzo fseek(fp,i*sizeof(contatto),SEEK_SET);
    mi sposto di blocco in blocco fra i contatti ma non so come accedere ad esempio al dato "telefono" del terzo contatto, oppure al dato "comune" del primo contatto, ecc...

    qualcuno mi dia delle dritte!!!! Grazie mille!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481

    Re: dritte su programma in C, file binario

    Al posto di tutte queste fread

    Originariamente inviato da davidemo89
    fread(nominativo,1,DIMN,fp);
    fread(telefono,1,DIMT,fp);
    fread(datanascita,1,DIMD,fp);
    fread(comune,1,DIMC,fp);
    utilizza solo questa

    fread (&contatto, sizeof(contatto), 1, fp);

    Importante: fai lo stesso con la fwrite, elimina il vecchio file e riscrivilo per fare una prova corretta.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ho fatto come dici tu, adesso ti mostro l'intero codice perchè si presentano ancora due problemi:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define DIMN 20
    #define DIMT 15
    #define DIMD 8
    #define DIMC 15
    
    typedef struct{
      char n[DIMN];//nominativo
      char t[DIMT];//telefono
      char d[DIMD];//data nascita
      char c[DIMC];//comune nascita
    }Contatto;
    
    
    
    /*
    Nome: aggiungi
    Descrizione: aggiunge un contatto alla rubrica
    Input: il puntatore al file binario, gli elementi presenti in rubrica
    Output: il nuovo numero di elementi presenti in rubrica
    */
    int aggiungi(FILE *fp, int n){
        
      Contatto contatto;
    
      fflush(stdin);
      printf("Inserisci cognome e nome: ");
      gets(contatto.n);                       //per acquisire anche lo spazio tra nome e cognome
      printf("Inserisci numero telefonico: ");
      scanf("%s",contatto.t);
      printf("Inserisci data di nascita (gg/mm/aa): ");
      scanf("%s",contatto.d);
      printf("Inserisci comune: ");
      scanf("%s",contatto.c);
      fseek(fp,0,SEEK_END);
      fwrite(&contatto,1,sizeof(contatto),fp);
      printf("\n\n");
    
    return;
    }
    
    /*
    Nome: stampa_tutto
    Descrizione: stampa la rubrica
    Input: il puntatore al file binario, gli elementi presenti in rubrica
    Output: nessuno
    */
    void stampa_tutto(FILE *fp, int n){
    
      Contatto contatto;
      int i;
      
      printf("%-20s%-15s%-15s%-20s\n\n","Nominativo","Telefono","Data Nascita","Luogo Nascita");
      for(i=0;i<n;i++){
        fseek(fp,((i)*(sizeof(contatto))),SEEK_SET);
        fread(&contatto,1,sizeof(contatto),fp);
        //printf("%s",contatto.d);
        printf("%-15s %-15s %-8s %-15s\n",contatto.n,contatto.t,contatto.d,contatto.c);
      }
      printf("\n");
    return;
    }
    
    int main(){
      
      FILE *fp;
      int x,n=-1;
      Contatto contatto;
      
      
      fp=fopen("Rubrica.dat","rb+");
      if(fp == NULL){
        fp=fopen("Rubrica.dat","wb");
        fclose(fp);
      }
      fp=fopen("Rubrica.dat","rb+");
      
      while(feof(fp)==0){             //conto quanti sono i contatti già salvati
        fread(&contatto,1,sizeof(contatto),fp);
        n++;
      }
      printf("In rubrica ci sono %d contatti\n\n",n);
      
      do{
        printf("(1) Aggiungi\n(2) Stampa rubrica\n(0) Esci\n");
        printf("--> ");
        scanf("%d",&x);
        switch(x){
          case 1: n=aggiungi(fp,n);
                  break;
          case 2: stampa_tutto(fp,n);
                  break;
        }
      }while(x > 0);
    
      fclose(fp);
      system("PAUSE");	
      return 0;
    }
    Tralasciando il problema della formattazione del testo ecco quello che succede:


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Mi domando come faccia il programma ad essere compilato se la funzione

    int aggiungi(FILE *fp, int n){

    che dovrebbe restituire un valore, non lo fa, visto che termina con

    return;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.