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

    Leggere una riga a caso da un file e copiarla in un altro file

    Salve a tutti. Non riesco a comporre il codice per creare questo banale programma.
    Ho un file tutte_righe.txt che contiene delle frasi separate per ogni rigo:
    codice:
    Frase1
    Frase2
    Frase3
    Frase4
    Volgio che in maniera del tutto random e casuale venga letta una riga dal file tutte_righe.txt e copiata nel file riga_scelta.txt

    Ho utilizzato questo codice ma come penso ci sono errori concettuali.

    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    int main() {
    	ifstream rd;
    	ofstream wr;
    	rd.open("tutte_righe.txt");
    	wr.open("riga_scelta.txt");
    	string line;
    	while(!rd.eof()) { 
    		getline(rd,line);
    		fout << line;
    	}
    	rd.close();
    	wr.close();
    	return 0;
    }
    Grazie per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prima di tutto

    fout

    non esiste da nessuna parte.

    Se devi scrivere nel file e hai chiamato lo stream wr devi usare wr.

    In secondo luogo, quel ciclo legge tutto il file e lo riscrive linea dopo linea.

    Se devi scegliere una linea random, devi generare un numero random (tramite le funzioni srand e rand) e contare le linee che leggi. Appena il contatore coincide con il valore random scelto, scrivi la linea e termini.

    Bisogna fare attenzione anche al fatto che il numero scelto possa essere maggiore del numero di linee contenute nel file.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Si scusami ho copiato la versione errata ho modificato quella voce.
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    int main() {
    	ifstream rd;
    	ofstream wr;
    	rd.open("tutte_righe.txt");
    	wr.open("riga_scelta.txt");
    	string line;
            int contatore;
            int ferma;
    
    while(!rd.eof()) { 
    contatore++;
    }
    ferma = rand() % contatore;
    
    while(!rd.eof()) {
    if(ferma == ??)
    
    		wr<< line;
    	}
    	rd.close();
    	wr.close();
    	return 0;
    }
    Questo andamento dovrebbe andare meglio dal punto di vista concettuale ma non del codice

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    1) Il contatore deve essere azzerato all'inizio

    2) Dopo la prima lettura, chiudi il file e riaprilo

    3) Quando il contatore è uguale al numero ottenuto e scrivi la riga, aggiungi un break per evitare di leggere ancora
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    int main() {
    	ifstream rd;
    	ofstream wr;
    	rd.open("tutte_righe.txt");
    	wr.open("riga_scelta.txt");
    	string line;
            int contatore = 0;
            int ferma = 0;
    
    while(!rd.eof()) { 
    contatore++;
    }
    ferma = rand() % contatore;
    
    rd.close();
    rd.open("tutte_righe.txt");
    while(!rd.eof()) {
    if(ferma == ??)
    
    		wr<< line;
    	}
    	rd.close();
    	wr.close();
    	return 0;
    }
    Come è possibile eseguire il terzo punto? Cosa mi restituisce la posizione del file?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prima del secondo ciclo devi azzerare nuovamente contatore e aumentarlo all'interno del ciclo stesso.

    Confronterai ferma con contatore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    int main() {
    	ifstream rd;
    	ofstream wr;
    	rd.open("tutte_righe.txt");
    	wr.open("riga_scelta.txt");
    	string line;
            int contatore = 0;
            int ferma = 0;
    
    while(!rd.eof()) { 
    contatore++;
    }
    ferma = rand() % contatore;
    
    rd.close();
    rd.open("tutte_righe.txt");
    contatore = 0;
    while(!rd.eof()) {
    if(ferma == contatore)
    
    		wr<< line;
    break;
    } else {
    contatore++;
     }
    	rd.close();
    	wr.close();
    	return 0;
    }

  8. #8
    Il compilatore mi da un errore sull'else

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quale errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Dopo il break chiudi una parentesi mai aperta..devi aprirla dopo if(condizione) ...infine manca la parentesi di chiusura del while

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.