Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    8

    [C++] Archivi, modifica di un campo di un record

    Scusate per il post di prima, ma i miei mi reclamavano per andare a cenare D:

    Volevo comunque dire che, quando lancio il programma, l'inserimento dei dati e la stampa funziona, ma c'è un problema nella modifica. Riesce a trovare il campo da modificare, mi fa inserire il nuovo campo che dovrebbe sostituire quello precedente ma non me lo modifica...

    Sto impazzendo e non riesco a risolvere il problema, qualcuno può aiutarmi? Grazie in anticipo!

    CODICE:
    *Non riesco ad inserirlo in modo corretto, non so il perché*

    codice:
    #include <iostream> 
    #include <stdio.h> 
    
    using namespace std; 
    
    struct lazio { 
      char nome [30]; 
                    }; 
    
    int menu (); 
    
    void inserimento (); 
    void modifica (); 
    void stampa (); 
    //------------------------------- main ---------------------------------------- 
    int main() 
    { 
      int s; 
      do { 
        s=menu(); 
        switch (s) { 
          case 1: inserimento (); break; 
          case 2: modifica (); break; 
          case 3: stampa (); break; 
          case 4: cout<<" "<<endl; 
                       } 
          } while (s!=4); return 0; 
    } 
    int menu () 
    { 
      int scelta; 
      cout<<"1 Inserimento "<<endl; 
      cout<<"2 Modifica "<<endl; 
      cout<<"3 Stampa "<<endl; 
      cout<<"4 Exit "<<endl; 
      cout<<" Scelta -> "; 
      
      cin>>scelta; 
      
      return scelta; 
    } 
    
    void inserimento () 
    { 
      FILE *fp; 
      lazio x; 
      
      fp=fopen("Lazio.dat","a+b"); //Apertura file 
      
      cout<<"Nome: "; 
      cin>>x.nome; 
    
      fwrite (&x, sizeof(lazio), 1, fp); //Scrittura nel file 
      
      fclose (fp);//Chiusura File 
    } 
    void modifica () 
    { 
      FILE *fp; 
      lazio x; 
      char y[30]; 
      int k=0; 
      int z=-1; 
      
      cout<<"Inserire un nome: "; 
      cin>>y; //Variabile che si confronterà con quella del file 
    
      fp=fopen("Lazio.dat", "r+b"); //Apertura File 
      while ( fread ( &x, sizeof (lazio), 1, fp ) ) //Ciclo che legge tutto il file 
      { 
        if ( strcmp (y,x.nome)==0 ) 
        { 
          cout<<"Nuovo nome: "; 
          cin>>x.nome; 
          
          fwrite (&x, sizeof(lazio), 1, fp); //Scriviamo sul File 
          fseek(fp, z, SEEK_CUR); 
          k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno 
        }   
      } 
      if (k==0) cout<<"Nome non trovato."<<endl; 
    
      fclose (fp); 
    } 
    
    void stampa () 
    { 
      FILE *fp; 
      lazio x; 
    
      fp=fopen("Lazio.dat", "rb"); //Apertura File 
    
      while ( fread ( &x, sizeof (lazio), 1, fp ) ) 
      { 
        cout<<"Nome: "<<x.nome<<endl; 
      } 
      fclose (fp); 
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Sovrascrivi la struttura successiva: dopo aver letto una struttura la posizione sul file segue questa struttura, per sovrascrivere la struttura che hai appena letto devi tornare indietro della grandezza di una struttura e posizionarti nel punto corretto.

    Inoltre stai scrivendo dei puntatori a carattere e non i caratteri veri e propri percui se rileggi lo stesso file in un'altra sessione il puntatore punterà in un area di memoria indefinita...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    8
    Il tornare indietro l'ho fatto con l'fseek prima dell'fwrite...
    L'unica cosa che non capisco è la seconda parte del tuo messaggio...
    Non so veramente cosa fare xD ( e non è un mio merito )...

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    8
    Ho provato prima a far fermare il file appena trovava il nome che gli volevo far modificare, poi vari cin e cout, di nuovo fseek per salire di un record e poi fwrite, ma mi ripete la riga "
    cout<<"Nuovo nome: ";
    cin>>x.nome;
    "
    Fino all'infinito...

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    8
    La nuova codifica, comunque sbagliata...

    codice:
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    struct lazio {
      char nome [30];
                    };
    
    int menu ();
    
    void inserimento ();
    void modifica ();
    void stampa ();
    //------------------------------- main ----------------------------------------
    int main()
    {
      int s;
      do {
        s=menu();
        switch (s) {
          case 1: inserimento (); break;
          case 2: modifica (); break;
          case 3: stampa (); break;
          case 4: cout<<" "<<endl;
                       }
          } while (s!=4); return 0;
    }
    int menu ()
    {
      int scelta;
      cout<<"1 Inserimento "<<endl;
      cout<<"2 Modifica "<<endl;
      cout<<"3 Stampa "<<endl;
      cout<<"4 Exit "<<endl;
      cout<<" Scelta -> ";
    
      cin>>scelta;
    
      return scelta;
    }
    
    void inserimento ()
    {
      FILE *fp;
      lazio x;
    
      fp=fopen("Lazio.dat","a+b"); //Apertura file
    
      cout<<"Nome: ";
      cin>>x.nome;
    
      fwrite (&x, sizeof(lazio), 1, fp); //Scrittura nel file
    
      fclose (fp);//Chiusura File
    }
    void modifica ()
    {
      FILE *fp;
      lazio x;
      char y[30];
      int k=0;
      int z=-1;
    
      cout<<"Inserire un nome: ";
      cin>>y; //Variabile che si confronterà con quella del file
    
      fp=fopen("Lazio.dat", "r+b"); //Apertura File
      while ( fread ( &x, sizeof (lazio), 1, fp ) ) //Ciclo che legge tutto il file
      {
        if ( strcmp (y,x.nome)==0 )
        {
        
          fseek (fp, 0, SEEK_CUR);
    
          cout<<"Nuovo nome: ";
          cin>>x.nome;
          fseek(fp, z, SEEK_CUR);
          fwrite (&x, sizeof(lazio), 1, fp); //Scriviamo sul File
          k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno
        }
      }
      if (k==0) cout<<"Nome non trovato."<<endl;
    
      fclose (fp);
    }
    
    void stampa ()
    {
      FILE *fp;
      lazio x;
    
      fp=fopen("Lazio.dat", "rb"); //Apertura File
    
      while ( fread ( &x, sizeof (lazio), 1, fp ) )
      {
        cout<<"Nome: "<<x.nome<<endl;
      }
      fclose (fp);
    }

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <iostream> 
    #include <stdio.h>
    #include <string.h>
    
    using namespace std; 
    
    struct lazio { 
      char nome [30]; 
                    }; 
    
    const size_t lazio_size = sizeof(char) * 30;
    const size_t lazio_nome_size = sizeof(char) * 30;
    
    void write_struct(lazio *x, FILE *fp);
    size_t read_struct(lazio *x, FILE *fp);
    void back_one_struct(FILE *fp);
    
    int menu (); 
    
    void inserimento (); 
    void modifica (); 
    void stampa (); 
    //------------------------------- main ---------------------------------------- 
    int main() 
    { 
      int s; 
      do { 
        s=menu(); 
        switch (s) { 
          case 1: inserimento (); break; 
          case 2: modifica (); break; 
          case 3: stampa (); break; 
          case 4: cout<<" "<<endl; 
                       } 
          } while (s!=4); return 0; 
    } 
    int menu () 
    { 
      int scelta; 
      cout<<"1 Inserimento "<<endl; 
      cout<<"2 Modifica "<<endl; 
      cout<<"3 Stampa "<<endl; 
      cout<<"4 Exit "<<endl; 
      cout<<" Scelta -> "; 
      
      cin>>scelta; 
      
      return scelta; 
    } 
    
    void inserimento () 
    { 
      FILE *fp; 
      lazio x; 
      
      fp=fopen("Lazio.dat","a+b"); //Apertura file 
      
      cout<<"Nome: "; 
      cin>>x.nome; 
    
      write_struct(&x, fp); //Scrittura nel file 
      
      fclose (fp);//Chiusura File 
    } 
    void modifica () 
    { 
      FILE *fp; 
      lazio x; 
      char y[30]; 
      int k=0; 
      int z=-1; 
      
      cout<<"Inserire un nome: "; 
      cin>>y; //Variabile che si confronterà con quella del file 
    
      fp=fopen("Lazio.dat", "r+b"); //Apertura File 
      while ( read_struct(&x, fp) ) //Ciclo che legge tutto il file 
      { 
        if ( strcmp (y,x.nome)==0 ) 
        { 
          cout<<"Nuovo nome: "; 
          cin>>x.nome; 
          
          back_one_struct(fp);
          write_struct(&x, fp);
    
          k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno 
        }   
      } 
      if (k==0) cout<<"Nome non trovato."<<endl; 
    
      fclose (fp); 
    } 
    
    void stampa () 
    { 
      FILE *fp; 
      lazio x; 
    
      fp=fopen("Lazio.dat", "rb"); //Apertura File 
    
      while ( read_struct(&x, fp) ) 
      { 
        cout<<"Nome: "<<x.nome<<endl; 
      } 
      fclose (fp); 
    }
    
    
    void write_struct(lazio *x, FILE *fp) {
    	fwrite(x->nome, lazio_nome_size, 1, fp);
    }
    size_t read_struct(lazio *x, FILE *fp){
    	return fread(x->nome, lazio_nome_size, 1, fp);
    }
    void back_one_struct(FILE *fp){
    	fseek(fp, -lazio_size, SEEK_CUR);
    }
    Così dovrebbe funzionare, anche se non ne ho la certezza in quanto non ho un compilatore C++...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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