2016-03-23 2 views
1

Я пытаюсь закодировать программу, которая выбирает 3 случайные строки из текстового файла (который содержит 50 строк) и выводит их на экран.C++: чтение случайной строки из текстового файла

Вот мой текущий код:

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; 
    } 

} 

я могу получить его, чтобы напечатать одну случайную строку, как это делает выше, но не три случайных линий.

+2

Вы можете прочитать все строки в памяти (массив или вектор). Затем выберите три «случайных» строки из массива/вектора. –

+3

Вы можете выбрать 3 номера рандома в начале (убедитесь, что они не совпадают). Тогда ваш тест: 'if (numOfLines == random1 || numOfLines == random2 || numOfLines == random3)' –

+0

@Loki Astari Спасибо! Собираюсь выяснить, как сделать первый вариант на самом деле! Я даже не думал об этом. – user5991813

ответ

1

Необходимо получить новое случайное число после его получения. Этот метод понадобится 3 раза в файле.

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

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

ИЛИ вы получите три случайных чисел, то просто начать во время цикла

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

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

Что вы должны сделать, зависит от того, что именно вы имеете в виду под «случайным» и какой выход вы хотите, и что вы есть как ввод.

Например, если вы хотите выбрать любые три разные строки, и вы хотите, чтобы все линии имели равную возможность появляться как любая из выходных строк, и если вы знаете количество строк, вы можете сделать что-то вроде этого :

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

(Или вы можете просто прочитать весь файл в вектор строк, перетасовать, что вектор и выбрать первые три непосредственно, вместо того, чтобы делать это косвенно, используя массив индексов.)

Если вы хотите выбрать три случайные строки и хотите, чтобы линии имели шанс быть выбранными дважды или три раза, вы можете сделать что-то наподобие второго примера KaiEn Suizai.

Другой вариант не зависит от количества строк: выборки резервуаров с algorithm R. С помощью этого вы читаете файл, выбирая строки, как вы видите их с вероятностью в соответствии с определенной формулой. В конце у вас есть количество строк, которые вы хотите, и распечатываете их. 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++; 
} 
Смежные вопросы