[c++] Estrarre una riga random da un file di testo

di Anonimizzato9270 il
4 risposte
Salve a tutti,

ho un problema con un programma che dovrei usare per estrarre e stampare su schermo una riga random da un file di testo. Ho scritto questo, tuttavia non funziona. Se mi aiutaste a trovare il bug ve ne sarei grato, grazie mille.

#include <iostream> 
#include <cstdlib> 
#include <windows.h> 
#include <fstream> 

using namespace std ; 



string riga_random(string autore, string file); 
int counter(string file); 

int counter(string file) 
{  
  ifstream f(file.c_str()); 
    string s; 
    int n ; 
    n = 0 ; 
    while(f.good()) //fino a quando c'è qualcosa da leggere .. 
    { 
        //legge tutta la riga dal file e la mette nella variabile s 
        getline(f, s); 
        n++ ; 
        //cout<<s<<endl; 
    } 
     return n ; 
     f.close(); //chiude il file 
} 
string riga_random(string file) 
{ 
       int n_riga, n_righe ; 
       n_righe = counter(file.c_str()) ; 
       n_riga = rand() % n_righe ; 
       ifstream f(file.c_str()); 
       int i; 
        
       string s ; 

       while ( i < n_riga ) 
       {      
             i = 1 ; 
             getline (f,s) ; 
             i++ ; 
              
             } 
           return s ;    
       } 
int main() 
{    
    string s; 
    s = riga_random("Quotes.txt"); 
    cout<< s; 
    system("PAUSE"); 
    return 0; 
} 


Vi allego anche due screenshoot del file di testo e del sorgente compilato:

- File di testo



- File compilato (n pratica vedo solo un puntatore lampeggiante)

4 Risposte

  • Perche leggi il file 2 volte? Lo leggi una volta sola e tieni tutte le stringhe in un vettore. Poi estrai random una riga dal vettore.
  • La prima volta mi serve per contare il numero di righe. La seconda volta prendo un numero random limitatamente al numero di righe esistenti e associo la riga al numero. Come dovrei fare per fare come hai detto tu?
  • 
    std::vector<std::string> righe;
    while(f.good()) //fino a quando c'è qualcosa da leggere ..
        {
            //legge tutta la riga dal file e la mette nella variabile s
            getline(f, s);
            righe.push_back(s) ;
            //cout<<s<<endl;
        } 
    
    .... 
    
    il vettore tiene tutto il file, 1 cella tiene una riga.
    righe.size() tiene il numero delle righe.
    
    int riga = rand() % righe.size();
    
    .....
    questo ti ritorna la riga scelta random prima.
    return righe[riga];
    
  • Figo, provo a usarlo! Grazie ti faccio sapere!
Devi accedere o registrarti per scrivere nel forum
4 risposte