C++怎么在文件中检索特定字符并输出到另外一个文件

比如给你一个文件,其中包含若干试题,每一个完整的试题都以【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;
}

需要注意的是,这种操作只适用于文本文件,如果你要处理二进制文件,则需要使用不同的方法。同时,本方法没有考虑到一些特殊情况,如文件格式错误等,你需要根据实际情况进行适当的修改和补充。