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

    [C++] Creare File Da Programma e Scriverci Sopra Dati Durante Stessa Esecuzione?

    Ho scritto un codice che analizzando due file binari, se un 'parametro' del primo file viene trovato nel secondo deve creare un terzo file avente il nome del parametro individuato e scrivervi altri valori relativi alla struttura in cui è racchiuso questo paramtero nel secondo file.

    Non ho avuto problemi a far creare il file, utilizzando questo codice:

    codice:
    char* NomeFile=temp.cognome;
    
    fstream file2;
    file2.open(NomeFile,ios::in|ios::out|ios::binary|ios::ate);
    if (!file2)
    file2.open(NomeFile,ios::out|ios::binary|ios::trunc);
    Ho però riscontrato che dopo la creazione sul file non viene scritto nulla, nonostante le istruzioni:

    codice:
    for(int n=1;n<inseriti;n++){
                 file2.write((char*) &*PuntaP1[n]->cognome,sizeof(char[20]));
                 cout<<"Inserisco "<<PuntaP1[n]->cognome<<endl;
                 system("pause");
                 file2.write((char*) &*PuntaP1[n]->nome,sizeof(char[20]));
                 cout<<"Inserisco "<<PuntaP1[n]->nome<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.giorno,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.giorno<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.mese,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.mese<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.anno,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.anno<<endl;
         }
    lavorino correttamente. Ho però verificato che se chiudo il programma e lo rieseguo senza cancellare i file creati dalla precedente esecuzione, tutti i valori vengono correttamente scritti su di esso.

    Come posso risolvere questo problema? Ovvero come posso far in modo che nella stessa esecuzione il programma crei il file e vi scriva sopra correttamente.

    Grazie mille a tutti e buona domenica ;-)
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Mah ... l'errore puo' essere ovunque ... se non mostri tutto il codice con tutto quello che serve per compilare e provare il codice, non si puo' dire nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Mah ... l'errore puo' essere ovunque ... se non mostri tutto il codice con tutto quello che serve per compilare e provare il codice, non si puo' dire nulla ...
    Lo posto subito, anche e è lunghissimo dato che ho evitato l'input sul file e bypassato il tutto assegnango a mano i valori:

    codice:
    /*
       Note            : Il file nome fisico docenti.dat contiene l'elenco dei 
                           docenti(tipo Rdocente) che insegnano in un corso il cui 
                           nome è Corso, mentre il file di nome fisico studenti.dat 
                           contiene l'elenco degli studenti (tipo Rstudente) che 
                           devono seguire quei corsi. I record degli studenti 
                           contendono Cognome,Nome,dataN,Corsi. I due file sono 
                           entrambi ordinati per key.
                           Scrivere una procedura che, per ogni docente, crei un
                           file, il cui nome coincide col cognome del docente,
                           contenente tutti gli studenti di quel corso(campi 
                           nome, congnome, data di nascita) in ordine alfabetico
                           per cognome e nome e a parità per data di nascita.
                           
       
    */     
    
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    struct Tpdata {
      int giorno;
      int mese;
      int anno;
      };
      
      struct cors{
                  char cor[20];
                  };
    
    struct Rlibro{
                                         int key;
                                         char cognome[20];
                                         char nome[20];
                                         char corso[20];
                                         };
                                         
    struct Rstudente{
                     int key;
                     char cognome[20];
                     char nome[20];
                     Tpdata dataN;
                     cors corso[20];
                     int Ncorsi;
                     
                    };
                    
    typedef Rlibro* Plibro; 
    typedef Rstudente* Pstudente;    
                                    
    void getfile(Pstudente [],int );
    void insort(Pstudente [],int ,Pstudente);
    double Datanum(Pstudente );
    
    const char Nomefile[ ]="studente.dat";
    const int Lrec=sizeof(Rlibro);
    const int Numpers=6;
    
    int main(){
        
        char chr;
        Rstudente libro;
        
      
       /*int Numpers;
        cout<<"Numero di libri da inserire: ";
        cin>>Numpers;
        fstream filepers;
        filepers.open("studente.dat",ios::in|ios::out|ios::binary|ios::ate);
        if (!filepers)
         filepers.open("studente.dat",ios::out|ios::binary|ios::trunc);
        while(Numpers>0){
        Inserimento(libro,chr);
        if (chr=='s') {
        filepers.seekp(0,ios::end);
        filepers.write((char*)&libro,Lrec);
        Numpers--; 
        }}
        filepers.close();*/
        
        Pstudente PuntaP1[101];
         getfile(PuntaP1,Lrec);  
         //for(int k=1;k<=Numpers;k++){
            //     stampa(*PuntaP1[k]);
               //  }
         system("pause");
         //SortStud(PuntaP1,Numpers,true);
         //putfile(PuntaP1,Numpers,Lrec);
        
        
        system("pause");
        return 0;
        
    }
    
    double Datanum(Pstudente x){
           
          return x->dataN.anno*10000+x->dataN.mese*100+x->dataN.giorno;
          }
    
    void getfile(Pstudente PuntaP1[],int Lrec){
         
         fstream file,file1;
         Rlibro temp;
         Rstudente temp1;
         file.open("docente.dat",ios::in|ios::out|ios::binary|ios::ate);
         if (!file)
         file.open("docente.dat",ios::out|ios::binary|ios::trunc);
         file1.open("studente.dat",ios::in|ios::out|ios::binary|ios::ate);
         if (!file1)
         file1.open("studente.dat",ios::out|ios::binary|ios::trunc);
         
         int NumFileStud=file1.tellg()/sizeof(Rstudente);
         //HACK
         NumFileStud=3;
    
         int Numstud=file.tellg()/Lrec;
         //HACK
         Numstud=3;
    
         file.seekg(0,ios::beg);
         int k=0,z=1;
         for(int i=1;i<=Numstud;i++){
                 
                 file.read((char*) &temp,Lrec);
                 //HACK
                 if(i==1){
                          strcpy(temp.corso,"DB");
                          cout<<temp.corso<<endl;
                          system("pause");
                          temp.key=1;
                          strcpy(temp.cognome,"Peron");
                          strcpy(temp.nome,"Adriano");
                          }
                 else if(i==2){
                          strcpy(temp.corso,"PRB");
                          cout<<temp.corso<<endl;
                          system("pause");
                          temp.key=2;
                          strcpy(temp.cognome,"Burattini");
                          strcpy(temp.nome,"Ernesto");
                          }
                  else if(i==3){
                          strcpy(temp.corso,"LUP");
                          cout<<temp.corso<<endl;
                          system("pause");
                          temp.key=3;
                          strcpy(temp.cognome,"Ax");
                          strcpy(temp.nome,"Int");
                          }
                 //
                 cout<<temp.cognome<<endl;
                 system("pause");
                 file1.read((char*) &temp1,sizeof(Rstudente));
                 //HACK
                 if(k==0){
                          temp1.dataN.giorno=26;
                          temp1.dataN.mese=02;
                          temp1.dataN.anno=87;
                          temp1.Ncorsi=2;
                          for(int i=0;i<temp1.Ncorsi;i++){
                          if(i==0)strcpy(temp1.corso[i].cor,"PRB");
                          else if(i==1)strcpy(temp1.corso[i].cor,"LUB");
                          cout<<temp1.corso[i].cor<<endl;
                          system("pause");
                          }
                          temp.key=1;
                          strcpy(temp1.cognome,"F");
                          strcpy(temp1.nome,"V");
                          }
                 //
                 cout<<temp1.cognome<<endl;
                 system("pause");
                 int inseriti=1;
                 while(k<NumFileStud){
                                     file1.read((char*) &temp1,sizeof(Rstudente));
                                     //HACK
                                     if(k==1){
                                              temp1.dataN.giorno=30;
                                      temp1.dataN.mese=11;
                                      temp1.dataN.anno=88;
                                      temp1.Ncorsi=2;
                                      for(int i=0;i<temp1.Ncorsi;i++){
                                      if(i==0)strcpy(temp1.corso[i].cor,"DB");
                                      else if(i==1)strcpy(temp1.corso[i].cor,"PRB");
                                      cout<<temp1.corso[i].cor<<endl;
                                      system("pause");
                                              }
                                              temp.key=2;
                                      strcpy(temp1.cognome,"C");
                                      strcpy(temp1.nome,"Z");
                                      }
                                     if(k==2){
                                              temp1.dataN.giorno=30;
                                      temp1.dataN.mese=12;
                                      temp1.dataN.anno=90;
                                      temp1.Ncorsi=0;
                                      for(int i=0;i<temp1.Ncorsi;i++){
                                      cout<<temp1.corso[i].cor<<endl;
                                      system("pause");
                                              }
                                       temp.key=3;
                                      strcpy(temp1.cognome,"Z");
                                      strcpy(temp1.nome,"L");
                                      }
                                     //
                                     int z=0;bool check=false;
                                     while(z<temp1.Ncorsi && !check){
                                     if(stricmp(temp1.corso[z].cor,temp.corso)==0){
                             cout<<"DEVO INSERIRE NELL\'ARRAY "<<temp1.cognome<<endl;
                             cout<<endl<<"INSERITI "<<inseriti;
                             system("pause");
                                     check=true;
                                     PuntaP1[inseriti]=new Rstudente;
                                     *PuntaP1[inseriti]=temp1;
                                     insort(PuntaP1,inseriti,PuntaP1[inseriti]);
                                     inseriti++;
                                     }
                                     cout<<"Ricerco Corso"<<temp1.corso[z].cor<<endl;
                                     z++;
                                     }
                                     k++;
                                     cout<<"Incremento k "<<k<<endl;
                                     system("pause");
                                     }
                                     k=0;
                                    cout<<endl<<"INSERITI FUORI"<<inseriti<<endl;
                                     for(int n=1;n<inseriti;n++){
                                             cout<<PuntaP1[n]->cognome<<endl;
                                             system("pause");
                                             }
                                                   
                 if(inseriti>1){
                 char* NomeFile=temp.cognome;
                 cout<<"NOM FILE "<<NomeFile<<endl;
                 system("pause");
                 fstream file2;
                 file2.open(NomeFile,ios::in|ios::out|ios::binary|ios::ate);
                 if (!file2)
                 file2.open(NomeFile,ios::out|ios::binary|ios::trunc);      
                                cout<<"\n\nINSERISCO"<<endl;
                 
                 for(int n=1;n<inseriti;n++){
                 file2.write((char*) &*PuntaP1[n]->cognome,sizeof(char[20]));
                 cout<<"Inserisco "<<PuntaP1[n]->cognome<<endl;
                 system("pause");
                 file2.write((char*) &*PuntaP1[n]->nome,sizeof(char[20]));
                 cout<<"Inserisco "<<PuntaP1[n]->nome<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.giorno,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.giorno<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.mese,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.mese<<endl;
                 file2.write((char*) &PuntaP1[n]->dataN.anno,sizeof(int));
                 cout<<"Inserisco "<<PuntaP1[n]->dataN.anno<<endl;
         }
         file2.close();
         }
         file1.seekg(0,ios::beg);
         cout<<"Ritorno Sopra"<<endl;
         }
         file.close(); 
         }
    
    
    void insort(Pstudente Punt[],int n,Pstudente Temp){
         
         int j;
         Punt[0]=Temp;
         j=n-1;
         cout<<"Sono nel Insertion"<<endl;
         system("pause");
        if(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)>0){
                      while(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)>0){
                      Punt[j+1]=Punt[j];
                      cout<<"Cognome"<<endl;
                      system("pause");
                      j--;
                      }
                      }
        if(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)==0 &&
                   stricmp(Punt[j]->nome,Punt[0]->nome)<0){
                      while(j>0 && stricmp(Punt[j]->nome,Punt[0]->nome)<0){
                      Punt[j+1]=Punt[j];
                      cout<<"Nome"<<endl;
                      system("pause");
                      j--;
                      } 
                      }  
        if(j>0 && stricmp(Punt[j]->nome,Punt[0]->nome)==0 && 
                                          Datanum(Punt[j])<Datanum(Punt[0])){
                      while(j>0 && Datanum(Punt[j])<Datanum(Punt[0])){
                      Punt[j+1]=Punt[j];
                      cout<<"Data"<<endl;
                      system("pause");
                      j--;
                      }   
                      }   
                 cout<<"Controlli Finiti"<<endl;
                 system("pause");     
                Punt[j+1]=Punt[0];
         }
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Fammi capire ... come posso notare il malfunzionamento con il codice che hai postato?

    Hai dei file di dati gia' predisposti?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Fammi capire ... come posso notare il malfunzionamento con il codice che hai postato?

    Hai dei file di dati gia' predisposti?
    Guarda siceramente ho testato il codice e funziona tranne che la creazione e la conseguente scrittura su file durante la stessa esecuzione del programma. L'unica cosa che faccio di diverso da un normale algoritmo per gestire file binari è di fare una "finta lettura" su un file vuoto per entrambi i file, e poi vado a riempire i campi della struttura che dovrebbe essere estratta dal file manualmente, questo per evitare di dover scrivere su file tutto, per me è + veloce così, solo per comodità.Per questo ritengo che il problema sia proprio nel frammento di codice postato all'inizio, quello che in effetti crea il file e vi va a scrivere, la crezione avviene correttamente ma la scrittura no.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma se hai un problema con l'apertura del file, lo fai il clear prima di operare con lo stesso file?

    Ovvero

    codice:
       if (!file2)
       {
          file2.clear();
          file2.open(NomeFile,ios::out|ios::binary|ios::trunc);
       }
    (e mi sembra che ne avessimo gia' parlato in passato di questo fatto ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Ma se hai un problema con l'apertura del file, lo fai il clear prima di operare con lo stesso file?

    Ovvero

    codice:
       if (!file2)
       {
          file2.clear();
          file2.open(NomeFile,ios::out|ios::binary|ios::trunc);
       }
    (e mi sembra che ne avessimo gia' parlato in passato di questo fatto ...)
    Ecco ora va, che io ricordi in un mio post non ne abbiamo mai parlato, forse era in un altro creato da un utente diverso, ho tatto anche una ricerca per verificare la mia memoria e non sono uscito tra i risultati per la parola clear che con questo post. Fatto sta che ora non lo dimenticherò +, spero. Mi potresti spiegare in "parole povere" cosa fa il comando da te aggiunto al livello di programma?

    Grazie mille.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ne abbiamo parlato nel forum, non con te ... ricordavo male ...

    Quando c'e' un errore nella gestione dei file con le classi C++, devi gestire i flag di stato del file stesso e resettarli se necessario. Dai un'occhiata a

    http://www.cplusplus.com/reference/i...ios/clear.html
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Originariamente inviato da oregon
    Ne abbiamo parlato nel forum, non con te ... ricordavo male ...

    Quando c'e' un errore nella gestione dei file con le classi C++, devi gestire i flag di stato del file stesso e resettarli se necessario. Dai un'occhiata a

    http://www.cplusplus.com/reference/i...ios/clear.html
    Grazie mille della segnalazione, ora ho capito, praticamente il programma ricorda l'errore e quindi non scrive sul file perchè a suo avviso questo non esiste, giusto? invece clear va a cancellare lo stato di errore riportandolo all'iniziale.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

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.