C ++:从文本文件中读取随机行

时间:2016-03-23 02:09:33

标签: c++ file text random line

我正在尝试编写一个程序,从文本文件(包含50行)中选取3个随机行并将它们输出到屏幕上。

这是我目前的代码:

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

}

我可以像上面那样打印一条随机线而不是三条随机线。

4 个答案:

答案 0 :(得分:2)

你应该做什么取决于“随机”究竟是什么意思,你想要什么样的输出,以及你有什么输入。

例如,如果要选择任意三个不同的行,并且希望所有行都有相同的机会显示为任何输出行,并且如果您知道行数,则可以执行以下操作:

  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

(或者你可以将整个文件读入一个字符串向量,将该向量混合并直接选择前三个,而不是使用索引数组间接地执行此操作。)

如果你想选择三条随机线,并且你希望线条被选中两次或三次,那么你可以做一些像凯恩绥子的第二个例子。

另一个选项不依赖于知道行数:使用algorithm R进行油藏采样。通过这个,您可以读取文件,根据某个公式以概率选择线条。最后,您可以获得所需的行数并将其打印出来。 Example

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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();
    }

}

答案 3 :(得分: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++;
}