比如给你一个文件,其中包含若干试题,每一个完整的试题都以【begin】开头,以【end】结尾,键盘输入一个数字x,我就要随机在这个文件中挑出x个试题输出到另外一个我自己创建的文件中去,且不能有重复的试题。
你可以使用C++中的文件流(std::ifstream 和 std::ofstream)来读取和写入文件,使用std::string的find()函数查找特定的字符串,使用std::set来存放已经输出的试题,从而避免重复。
#include <fstream>
#include <iostream>
#include <random>
#include <set>
#include <string>
#include <vector>
//打开要读取的文件和要写入的文件,并进行错误检查
int main() {
std::ifstream inFile("input.txt");
std::ofstream outFile("output.txt");
if (!inFile) {
std::cerr << "不能打开输入文件" << std::endl;
return 1;
}
if (!outFile) {
std::cerr << "不能打开输出文件" << std::endl;
return 1;
}
//读取文件内容,查找试题。
std::vector<std::string> questions; // 存放题目
std::string line;
bool in_question = false;
while (std::getline(inFile, line)) {
if (line == "[begin]") {
in_question = true;
questions.push_back(line);
} else if (line == "[end]") {
in_question = false;
questions.push_back(line);
} else if (in_question) {
questions.push_back(line);
}
}
//随机从试题中选取指定数量的试题,并输出到文件。
std::set<int> selected_indexes; // 存储已选试题的下标
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(0, questions.size() - 1);
int x = 10; // 要输出的试题数量
int count = 0; // 已输出的试题数量
while (count < x) {
int index = distr(gen); // 随机选取一个下标
if (selected_indexes.count(index) == 0) {
// 如果该试题没有被选过,则输出到文件
selected_indexes.insert(index);
for (int i = index; i < questions.size() && questions[i] != "[end]"; ++i) {
outFile << questions[i] << std::endl;
}
++count;
}
}
//关闭文件并退出程序。
inFile.close();
outFile.close();
return 0;
}
需要注意的是,这种操作只适用于文本文件,如果你要处理二进制文件,则需要使用不同的方法。同时,本方法没有考虑到一些特殊情况,如文件格式错误等,你需要根据实际情况进行适当的修改和补充。