我试图从文本文件中读取随机行。
到目前为止我的代码选择了第一行,但我需要一个随机行。
我如何获得随机线?
string line;
if(infile.good()){
getline(infile, line);
}
答案 0 :(得分:2)
您可以将文件的行读入std::vector<std::string>
并随机访问向量大小范围内的特定行:
std::string line;
std::vector<std::string> lines;
while(getline(infile, line)) {
lines.push_back(line);
}
if(lines.size() >= 4) {
std::cout << "Line number 5: " << lines[4] << std::endl;
}
另一个选择是首先设置一个随机数,并计算读取的行:
int lineno = 5;
int linecount = 0;
std::string line;
while(getline(infile, line)) {
++linecount;
if(linecount == lineno) {
std::cout << "Line number " << lineno << ": " << line << std::endl;
}
}
答案 1 :(得分:2)
您可以使用&#34;水库采样&#34;这些相关帖子中描述的方法:
我们从维基百科关于水库采样的文章中学习:
水库采样是一系列随机算法,用于从包含n个项目的列表S中随机选择k个项目的样本,其中n是非常大或未知的数字。通常,n足够大,列表不适合主存储器。
使用这种算法,可以在一次通过中从一系列未知长度中选择随机元素,而无需将所有元素存储在内存中。
这是一个(未经测试的)示例:
#include <cstdlib>
#include <iostream>
#include <random>
#include <string>
int main() {
std::random_device seed;
std::mt19937 prng(seed());
std::string line, result;
for(std::size_t n = 0; std::getline(std::cin, line); n++) {
std::uniform_int_distribution<> dist(0, n);
if (dist(prng) < 1)
result = line;
}
std::cout << "random line: '" << result << "'\n";
}
示例输出:
$ g++ test.cc -std=c++11 && ./a.out < test.cc
random line: '#include <iostream>'
供参考:
答案 2 :(得分:1)
随机调用getline
次,如果到达文件末尾,请务必停止循环播放。
只要您不知道文件中的行多长时间就无法以某种方式计算任何行的开头(当然除了第一行)并直接寻找到那一点。
答案 3 :(得分:0)
您可以将行首的文件偏移量存储到std::vector
。接下来,生成随机数。使用数字作为std::vector
的索引,并获取该行的起始位置。寻找那个位置并获取该线。
std::vector<std::streampos> line_offsets;
line_offsets.push_back(0); // The first line.
std::string text_line;
while (getline(text_file, text_line))
{
std::streampos file_offset = text_file.tellg();
line_offsets.push_back(file_offset);
}
//...
std::streampos offset = line_offsets[Get_Random_Line_Number()];
text_file.seekg(offset);
std::string random_text_line;
getline(text_file, random_text_line);
此方法不会使用将每个文本行存储到向量中的内存。