Oppure

Loading
30/05/10 16:13
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:
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:

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;
    }
aaa
30/05/10 16:31
Xaratroom
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:
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:

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
aaa
30/05/10 16:41
XBarboX
Scusa ma io non ho mai fatto un puntatore ad una classe e non sono riuscito a correggerlo. Potresti dirmi come fare?
aaa
30/05/10 19:20
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.

30/05/10 20:25
Xaratroom
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.
aaa
30/05/10 21:58
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
aaa
31/05/10 14:55
HeDo
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.
aaa
31/05/10 19:29
XBarboX
fout.open(buf, ios::out);

Funziona alla grande :k:
aaa