c++如何文件中N行数据中随机抽取M行数据,M行数据生成一个文件,剩下的生成另一个文件
时间: 2024-10-17 14:09:55 浏览: 26
在C++中,你可以通过`fstream`库来操作文件,并结合随机数生成功能来实现这个需求。这里是一个基本的步骤描述:
1. 打开原始文件并读取所有行:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
std::ifstream inputFile("input.txt");
std::vector<std::string> lines;
std::string line;
while (std::getline(inputFile, line)) {
lines.push_back(line);
}
```
2. 确定随机抽取的行数 `M` 和剩余行数(假设总行数为 `N`):
```cpp
int M = ...; // 需要抽样的行数
int remainingLines = N - M;
```
3. 创建两个文件流,分别用于存储抽样后的数据和剩余的数据:
```cpp
std::ofstream sampledOutput("sampled_data.txt");
std::ofstream remainingOutput("remaining_data.txt");
```
4. 使用随机数生成器(例如 `std::default_random_engine` 和 `std::uniform_int_distribution`)从 `lines` 中随机选择 `M` 行:
```cpp
std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());
std::vector<int> randomIndices(M);
for (int i = 0; i < M; ++i) {
std::uniform_int_distribution<> distribution(0, lines.size() - 1);
randomIndices[i] = distribution(generator);
}
// 将随机索引对应的行写入到抽样文件
for (int index : randomIndices) {
sampledOutput << lines[index] << "\n";
}
```
5. 写入剩余的行到另一个文件:
```cpp
// 写入剩余的行
for (size_t i = 0; i < lines.size(); ++i) {
if (std::find(randomIndices.begin(), randomIndices.end(), i) == randomIndices.end()) {
remainingOutput << lines[i] << "\n";
}
}
```
6. 关闭文件:
```cpp
inputFile.close();
sampledOutput.close();
remainingOutput.close();
```
阅读全文