XBarboX (Member)
Guru
Messaggi: 945
Iscritto: 31/12/2008
|
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 |
if(c>=10000){ //c è il contatore dei numeri primi trovati n++; //Aumenta di uno il nome del file, in modo da ottenere file 1,2,3,4,5,6...ecc fout.close();//chiudo fout char buf[5]; itoa(n, buf, 10);//converto n in vettore char ofstream fout(buf);//cambio stream <--- QUI E' L'errore }
|
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++ |
int main(){ long long int x = 0; //numero da controllare se primo long long int c = 0; //contatore numeri primi trovati long long int n = 1; //file ofstream fout("1"); for(;;){ x++; if(Primo(x) == true){c++; fout<<x<<endl;} if(c>=1000){ c=0; n++; fout.close(); char buf[5]; itoa(n, buf, 10); ofstream fout(buf); } } return 0; }
|
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
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 |
if(c>=10000){ //c è il contatore dei numeri primi trovati n++; //Aumenta di uno il nome del file, in modo da ottenere file 1,2,3,4,5,6...ecc fout.close();//chiudo fout char buf[5]; itoa(n, buf, 10);//converto n in vettore char ofstream fout(buf);//cambio stream <--- QUI E' L'errore }
|
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++ |
int main(){ long long int x = 0; //numero da controllare se primo long long int c = 0; //contatore numeri primi trovati long long int n = 1; //file ofstream fout("1"); for(;;){ x++; if(Primo(x) == true){c++; fout<<x<<endl;} if(c>=1000){ c=0; n++; fout.close(); char buf[5]; itoa(n, buf, 10); ofstream fout(buf); } } return 0; }
|
|
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 |
|
XBarboX (Member)
Guru
Messaggi: 945
Iscritto: 31/12/2008
|
Scusa ma io non ho mai fatto un puntatore ad una classe e non sono riuscito a correggerlo. Potresti dirmi come fare?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/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à. |
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
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. |
|
StackMaster93 (Normal User)
Newbie
Messaggi: 5
Iscritto: 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
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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. |
|
XBarboX (Member)
Guru
Messaggi: 945
Iscritto: 31/12/2008
|
fout.open(buf, ios::out);
Funziona alla grande
|
|