2016-03-23 7 views
1

Ich versuche, ein Programm zu programmieren, das 3 zufällige Zeilen von einer Textdatei auswählt (die 50 Zeilen enthält) und sie auf den Bildschirm ausgibt.C++: Gelesene gelegentliche Linie von der Textakte

Hier ist mein aktueller Code:

string line; 
int random = 0; 
int numOfLines = 0; 
ifstream File("file.txt"); 

    srand(time(0)); 
    random = rand() % 50; 

while(getline(File, line)) 
{ 
    ++numOfLines; 

    if(numOfLines == random) 
    { 
     cout << line; 
    } 

} 

ich es bekommen kann eine zufällige Zeile zu drucken, wie es oben tut, aber nicht drei zufällige Linien.

+2

Sie können alle Linien in den Speicher (ein Array oder Vektor) lesen. Wählen Sie dann drei "zufällige" Zeilen aus dem Array/Vektor. –

+3

Sie können am Anfang 3 Randomzahlen wählen (stellen Sie sicher, dass sie nicht gleich sind). Dann lautet dein Test: 'if (numOfLines == random1 || numOfLines == random2 || numOfLines == random3)' –

+0

@Loki Astari Danke! Ich werde versuchen, herauszufinden, wie man die erste Option tatsächlich macht! Ich habe nicht einmal daran gedacht, es so zu machen. – user5991813

Antwort

1

Sie müssen eine neue Zufallszahl erhalten, nachdem Sie eine bekommen haben. Diese Methode benötigt 3-mal eine Schleife für die Datei.

int count = 1; 
While(count <= 3) 
{ 
    random = rand() % 50; 
    while(getline(File, line)) 
    { 
     ++numOfLines; 

     if(numOfLines == random) 
     { 
      cout << line; 
     } 
    } 
    count++; 
} 

ODER Sie erhalten drei Zufallszahl dann starten Sie einfach while-Schleife

random = rand() % 50; 
random1 = rand() % 50; 
random2 = rand() % 50; 
while(getline(File, line)) 
{ 
    ++numOfLines; 

    if(numOfLines == random || numOFLines == random1 || numOfLines == random2) 
    { 
     cout << line; 
    } 
} 
1

Was Sie sollten davon abhängig machen, was genau meinen Sie mit ‚zufällig‘ und welche Art von Ausgabe, die Sie wollen und was Sie habe als Eingabe.

Wenn Sie beispielsweise drei verschiedene Zeilen auswählen möchten und alle Zeilen die gleiche Chance haben sollen, als eine der Ausgabezeilen zu erscheinen, und wenn Sie die Anzahl der Zeilen kennen, können Sie so etwas tun :

int number_of_lines = 50; 

    // a vector to hold all the indices: 0 to number_of_lines 
    std::vector<int> line_indices(number_of_lines); 
    std::iota(begin(line_indices), end(line_indices), 0); // init line_indices 

    // C++11 random library (should be preferred over rand()/srand()) 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    std::mt19937 eng(seed); 

    // shuffle the line_indices: 
    std::shuffle(begin(line_indices), end(line_indices), eng); 

    int number_of_lines_to_select = 3; 
    assert(number_of_lines_to_select <= number_of_lines); 

    std::string line; 
    std::ifstream file("file.txt"); 

    int line_number = 0; 
    while (std::getline(file, line)) { 
    for (int i = 0; i < number_of_lines_to_select; ++i) { 
     if (line_number == line_indices[i]) { 
     std::cout << line << '\n'; 
     } 
    } 
    ++line_number; 
    } 

Live example

(Oder Sie könnten nur die gesamte Datei in einen Vektor von Strings lesen, dass Vektor mischen und die ersten drei direkt wählen, anstatt dies indirekt zu tun, eine Reihe von Indizes verwendet wird.)

Wenn Sie drei zufällige Linien auswählen möchten und möchten, dass Linien zweimal oder dreimal ausgewählt werden, können Sie etwas wie KaiEn Suizais zweites Beispiel tun.

Eine andere Option hängt nicht von der Anzahl der Linien ab: Reservoir-Probenahme mit algorithm R. Damit lesen Sie die Datei durch und selektieren Linien mit einer Wahrscheinlichkeit nach einer bestimmten Formel. Am Ende haben Sie die Anzahl der gewünschten Zeilen und Sie drucken sie aus.

Example
0
#include <iostream> 
#include <fstream> 
#include <random> 
#include <string> 
#include <vector> 

int randomNumber() { // Using C++11 random features 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_real_distribution<double> dist(0.0, 50.0); 
    return dist(mt); 
} 

int main() 
{ 
    std::ifstream file("file.txt"); 
    std::vector<std::string> lines(50); // # of lines here (instead of using push_back) 

    while (file.is_open()) { 
     for (auto i = 0; i < lines.size(); ++i) { 
      std::getline(file, lines[i]); 
     } 
     file.close(); 
    } 

    std::vector<int> rand_index(3); // # of random numbers here 

    for (auto i = 0; i < rand_index.size(); ++i) { 
     rand_index[i] = randomNumber(); 
    } 

} 
0
//first store the line numbers you want to read in array, you can do it as follow: 

int linetoRead[3]; 

for(int i =0 ;i<3;i++) 
{ 
    linetoRead[i] = rand() % 50; 
} 

bool isKeep(int lineN) 
{ 
    for(int i =0 ;i<3;i++) 
    { 
    if(linetoRead[i] == lineN) 
     return true; 
    } 
    return false; 
} 
//then do the while loop as follows 
int LineRead = 0; 
int lineN = 0; 
while(getline(File, line) && LineRead < 3) 
{ 
    if(isKeep(lineN)) 
    { 
     // keep the line or display it 
     LineRead++; 
     cout << line; 
    } 
    lineN++; 
}