Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Come cambiare file di uscita fstream
Forum - C/C++ - Come cambiare file di uscita fstream

Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 18:13
Domenica, 30/05/2010
Salve,
forse sto per fare una domanda banale ma non riesco a capire perchè questo sorgente non funziona.
Praticamente sto faceondo un programma che trova i numeri i primi e gli stampa si PIU file testo in modo da evitare di creare file testo enormi e difficili da gestire.

Allora ho pensato di cambiare file testo ogni 10000 numeri primi che trova.

Io per far ciò ho scritto questo:
Codice sorgente - presumibilmente Delphi

  1. if(c>=10000){ //c è il contatore dei numeri primi trovati
  2.  n++; //Aumenta di uno il nome del file, in modo da ottenere file 1,2,3,4,5,6...ecc
  3.  fout.close();//chiudo fout
  4.  char buf[5];
  5.  itoa(n, buf, 10);//converto n in vettore char
  6.  ofstream fout(buf);//cambio stream <--- QUI E' L'errore
  7. }




Proaticamente il file 1 lo crea correttamente con 10000 numeri primi mentre i file 2,3,4,5.. ecc li genera ma non ci scrive nulla.

Posto il sorgente completo in modo da poter capire meglio il procedimento:

Codice sorgente - presumibilmente C++

  1. int main(){
  2.     long long int x = 0;  //numero da controllare se primo
  3.     long long int c = 0;  //contatore numeri primi trovati
  4.     long long int n = 1;  //file
  5.    
  6.    ofstream fout("1");
  7.    
  8.     for(;;){
  9.            
  10.             x++;
  11.             if(Primo(x) == true){c++; fout<<x<<endl;}
  12.                  
  13.             if(c>=1000){
  14.                         c=0;
  15.                         n++;
  16.                         fout.close();
  17.                         char buf[5];
  18.                         itoa(n, buf, 10);
  19.                         ofstream fout(buf);
  20.                         }    
  21.                        
  22.            
  23.            
  24.             }
  25.     return 0;
  26.     }


PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 18:31
Domenica, 30/05/2010
Testo quotato

Postato originariamente da XBarboX:

Salve,
forse sto per fare una domanda banale ma non riesco a capire perchè questo sorgente non funziona.
Praticamente sto faceondo un programma che trova i numeri i primi e gli stampa si PIU file testo in modo da evitare di creare file testo enormi e difficili da gestire.

Allora ho pensato di cambiare file testo ogni 10000 numeri primi che trova.

Io per far ciò ho scritto questo:
Codice sorgente - presumibilmente Delphi

  1. if(c>=10000){ //c è il contatore dei numeri primi trovati
  2.  n++; //Aumenta di uno il nome del file, in modo da ottenere file 1,2,3,4,5,6...ecc
  3.  fout.close();//chiudo fout
  4.  char buf[5];
  5.  itoa(n, buf, 10);//converto n in vettore char
  6.  ofstream fout(buf);//cambio stream <--- QUI E' L'errore
  7. }




Proaticamente il file 1 lo crea correttamente con 10000 numeri primi mentre i file 2,3,4,5.. ecc li genera ma non ci scrive nulla.

Posto il sorgente completo in modo da poter capire meglio il procedimento:

Codice sorgente - presumibilmente C++

  1. int main(){
  2.     long long int x = 0;  //numero da controllare se primo
  3.     long long int c = 0;  //contatore numeri primi trovati
  4.     long long int n = 1;  //file
  5.    
  6.    ofstream fout("1");
  7.    
  8.     for(;;){
  9.            
  10.             x++;
  11.             if(Primo(x) == true){c++; fout<<x<<endl;}
  12.                  
  13.             if(c>=1000){
  14.                         c=0;
  15.                         n++;
  16.                         fout.close();
  17.                         char buf[5];
  18.                         itoa(n, buf, 10);
  19.                         ofstream fout(buf);
  20.                         }    
  21.                        
  22.            
  23.            
  24.             }
  25.     return 0;
  26.     }



ofstream fout(buf); ti crea un oggetto di nome fout che è già stato dichiarato e che per le regole di lifetime non esiste al di fuori della struttura condizionale.
Per risolvere puoi mettere fout come puntatore

PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 18:41
Domenica, 30/05/2010
Scusa ma io non ho mai fatto un puntatore ad una classe e non sono riuscito a correggerlo. Potresti dirmi come fare?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:20
Domenica, 30/05/2010
Al posto di creare un nuovo oggetto (la cui visibilità è limitata alla if), sostituisci la

ofstream fout(buf);

con una

fout.open(buf, ios::out);

per utilizzare l'oggetto già creato.



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 22:25
Domenica, 30/05/2010
Testo quotato

Postato originariamente da nessuno:

Al posto di creare un nuovo oggetto (la cui visibilità è limitata alla if), sostituisci la

ofstream fout(buf);

con una

fout.open(buf, ios::out);

per utilizzare l'oggetto già creato.



Oddio, non ci avevo proprio pensato.

PM Quote
Avatar
StackMaster93 (Normal User)
Newbie


Messaggi: 5
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 23:58
Domenica, 30/05/2010
Ciao,piccola integrazione, oppure potresti usare ios_base::app che appende le stringhe create in un file e quindi non le elimina di nuovo, ios::out invece elimina il testo immesso oppure numero ecc se rieseguito il codice, cmq e giusto anche ios::out ciao e alla prossima

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 16:55
Lunedì, 31/05/2010
Testo quotato

Postato originariamente da StackMaster93:

Ciao,piccola integrazione, oppure potresti usare ios_base::app che appende le stringhe create in un file e quindi non le elimina di nuovo, ios::out invece elimina il testo immesso oppure numero ecc se rieseguito il codice, cmq e giusto anche ios::out ciao e alla prossima  



non credo che questo centri niente... lui vuole creare file diversi, non aggiungere stringhe allo stesso file.

PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 21:29
Lunedì, 31/05/2010
fout.open(buf, ios::out);

Funziona alla grande :k:

PM Quote