Lettura da file binario

di il
6 risposte

Lettura da file binario

Ciao a tutti,è la prima volta che posto un argomento .MI sto esercitando per un esame e il programma che devo scrivere deve trovare uno studente con una certa matricola in un file binario. Ho iniziato a scrivere del codice per inserire il nome di uno o più studenti in un file,ma quando vado in lettura mi compare solo il primo nome che ho inserito e gli altri non vengono letti premetto che non sono un genio del C quindi se qualcuno può aiutarmi . Posto il codice:

#include <stdio.h>
#include <stdlib.h>

        
int main(int argc, char *argv[])
{
  FILE *fp;
  char nome [60];
  
  int i ; int n = 0;
  
  fp = fopen("FileStudente.txt" , "wb");
  printf("Quanti studenti vuoi inserire?\n");
  scanf ( "%d" ,&i);
  
  if(i==1)  //se voglio inserire un solo studente
  {
          if(fp){
          printf("Inserisci il nome:");
          scanf("%s", &nome);
          fwrite(&nome, sizeof(nome) , 1,fp);
                }
        
           else 
               {
               exit(1);
               printf("Errore di caricamento file\n");
               }



 }
  else if(i>1) {        // se voglio inserire più studenti
  for(n=0;n <i ;n++){
            printf("Inserisci il nome:");
            scanf("%s", &nome);
            fwrite(&nome, sizeof(nome), 1,fp);    //scrivo il nome nel file
            fseek(fp,0,SEEK_END);     /*porto il puntatore alla fine del file così 
                     alla scrittura del  successivo nome, non viene sovrascritto il nome
                              precedente ,  anche se non so se serve */ 
                    }
              }
fclose(fp);

fp = fopen("FileStudente.txt", "rb");        // apro il file per leggere i nomi
fseek(fp, 0 ,SEEK_SET);                      // riporto il puntatore all'inizio
  fread(&nome , sizeof(nome) , 1,fp);        // leggo il file ma esce solo il primo nome che ho inseritoo
  printf("Il nome inserito e\': %s\n",nome);

fclose(fp);
  
  system("PAUSE");	
  return 0;
}

6 Risposte

  • Re: Lettura da file binario

    Prima di tutto, al posto della scanf("%s",&stringa); ti consiglio di usare la funzione gets(stringa) che è molto meglio(credo che la scanf per le stringhe non incameri gli spazi o roba del genere, non so se devi inserire nome e cognome quindi non credo sia necessario).
    I due if che hai usato non sono necessari, basta fare così:
    
    
    if(!fp){
    
    printf("ERRORE");
    exit(1);
    }
    printf("Quanti studenti vuoi inserire?\n");
      scanf ( "%d" ,&i);
    
     for(n=0;n <i ;n++){
    Ecc....
    
    Hai scritto:
    fread(&nome , sizeof(nome) , 1,fp);
    Credo che il tuo problema risieda in quell'1 e soprattutto che nome è un array di caratteri.
    Prova ad usare un array di array di caratteri e fai un for per stampare il tutto.
  • Re: Lettura da file binario

    Grazie prima di tutto per avermi risposto Insomma ho fatto le modifiche da te suggerite anche se il gets mi dava problemi..mi stampava due volte la stringa sull'output e quindi ho lasciato scanf. Cmq adesso ho un altro problema praticamente ho definito una struct studente e nel file vado a scrivere
    i vari dati degli studenti..Siccome il numero di studenti deve essere inserito da riga di comando, ho scritto "struct studente s" dopo aver inserito il valore di " i " (del numero di studenti). Il programma parte ma il ciclo for si blocca alla prima iterazione ,una volta inseriti il numero di esami si blocca proprio l'esecuzione del programma quindi non so che errore sia ..Potresti aiutarmi?..grazie
    
    #include <stdio.h>
    #include <stdlib.h>
    
     struct studente {
           char nome [50][80];
           char cognome [50][80];
           int esami ;
           };
                   
    int main(int argc, char *argv[])
    {
      FILE *fp;
      
      
      int i ; int n ;
      
      fp = fopen("FileStudente.bin" , "wb");
       
      if (!fp){
          printf("ERRORE");
          exit(1);
              }
         printf("Quanti studenti vuoi inserire?\n");
         scanf ( "%d" ,&i); 
         struct studente s[i];
      
      for(n=0;n < i ;n++){
                printf("Inserisci il nome:");
                scanf("%s",s[n].nome);
                printf("Inserisci il cognome:");
                scanf("%s",s[n].cognome);
                printf("Inserisci il numero di esami:");
                scanf("%d" , s[n].esami ) ;
                fwrite(&s, 1, sizeof(s),fp);  
                         
                         }
                fclose(fp);
    
    fp = fopen("FileStudente.bin", "rb");        
    
      for(n=0;n<i ; n++) {                   
                         fread(&s , 1 , sizeof(s),fp);        
                         printf("Il nome inserito e\': %s\n",s[n].nome);
                         }
    fclose(fp);
      
      system("PAUSE");	
      return 0;
    }
    
    
  • Re: Lettura da file binario

    Perché nella struct hai dichiarato delle matrici ?
    Non ne hai bisogno credo, o usi la struct(che ti consiglio) o usi una matrice.
    Poi non hai usato il typedef, che ci vuole per definire il nuovo tipo studente se no non puoi definire un array di strutture.
    Quindi:
    
    typedef struct studente{
            char nome[50];
            char cognome[50];
            int esami;
    //Ecc...
    };
    //A questo punto puoi definire un array di strutture usando il nuovo tipo creato:
    studente scuola[i];
    //L'array scuola è di tipo studente e si accede ad ogni parametro così: scuola[indice].nome del //parametro.
    
    Non so perché hai problemi con la gets, l'unico suo inconveniente è che non ti avverte se sfori lo spazio sull'array ma a parte questo non c'è altro da dire.
  • Re: Lettura da file binario

    Grazie ho risolto come hai detto tu , ho capito come si fà adesso Scusa solo un'ultima domanda,sono andato avanti facendo anche la ricerca matricola e adesso stavo facendo la ricerca per nome con uno switch-case ho fatto i vari casi. Nel 'case' dove faccio la ricerca per nome uso delle variabili che ho inizializzato nel main ( int count =0; char nm [20] ; int posiz_nome [10] e nel case mi salvo le posizioni dove sono i nomi e poi alla fine mi stampo i vari nomi degli studenti se sono uguali al nome inserito dall'utente. Il problema è che il mio programma per come l ho scritto, ogni volta che si sceglie uno dei case qualunque, lo esegue e poi ritorna alla scelta delle operazioni da fare ( senza terminare l'esecuzione del programma insomma). Nel caso volessi fare un'altra ricerca per nome, le variabili dentro il case quindi, hanno ancora il valore che avevano nella ricerca precedente quindi anche se il programma funziona,mi stampa una cosa invece di un 'altra.Questo perchè il C non mi fà inizializzare le variabili nel case. Sai come posso fare percaso?
    
    int myvar;
    switch (my var)
    case 1: //ricerca per nome
    printf("nome da cercare:");
    gets(nm);
    for(i=0; i<n ; i++)
    if (strcmp ( s[i].nome , nm ) != 0 ) 
    printf(" ");
    else  {
    posiz_nome[count] = i;
    count ++;
     }
    for ( i = 0 ; i < count ; i++ ) 
    printf ( "%s " , s [ posiz_nome[i] ].nome)
    etc etc
    
  • Re: Lettura da file binario

    Scusa, potresti postare tutto il codice se no non mi è chiaro qual'era la tua idea...
    Per ora noto che hai sbagliato a scrivere la variabile "myvar" nello switch(hai scritto my var), è importante, soprattutto nel C(che è case sensitive), riscrivere le variabile esattamente come le hai dichiarate. Scusa il ritardo ma ho visto il tuo messaggio solo ora...
    Poi, ti consiglio, ma ovviamente non sei obbligato a farlo , di usare la ricerca binaria(o dicotomica se vuoi fare il sapientone ). Cambia solo l'efficienza temporale rispetto alla ricerca lineare quindi nel tuo caso dove non devi controllare un gran numero di dati è indifferente ma dato che mi sembra che tu voglia impegnarti col C ...
  • Re: Lettura da file binario

    Si mi sono accorto di aver chiamato le variabili in modo diverso ma solo perchè non ho fatto copia incolla dal mio codice ma l'ho scritto al volo perchè il problema non era quello.cmq ho risolto,insomma non potevo inizializzare le variabili nel " case # " e quindi l ho fatto nel " do " che quando lancio il programma mi fa uscire la lista delle possibili cose da fare. Adesso provo ad usare la ricerca binaria come hai suggerito tu. Cmq grazie per le varie risposte
Devi accedere o registrarti per scrivere nel forum
6 risposte