#include<iostream>
#include<string>
#include<filesystem> //核心库文件,使用时要先将C++版本调至C17
#include<fstream> //用了getline来获取文件名字,cin读不到空格之类的符号
#include<regex> //用了正则表达式提取数字
#include<vector> //变长数组,用于存放数据
#include <algorithm> //借用了sort,reverse等功能
using namespace std;
namespace fs = filesystem;
using namespace fs;
//1.提取文件名,再用正则表达式提取数字,排序完存放到动态数组中
vector<int> TQ(vector<int> m)
{
cin.sync();
cout << "请输入文件地址:" << endl;
path P;
string T, T2;
string pathStr;
// 使用 cin.getline() 读取可能包含空格的文件路径
std::getline(std::cin, pathStr); // 假设路径不会超过1024个字符
P = pathStr; // 将 string 对象转换为 path 对象
try {
for (const auto& entry : fs::directory_iterator(P)) {
T = entry.path().string();
regex rx("\\d{13}");
// 将原始字符串倒序
string rev = T;
reverse(rev.begin(), rev.end());
smatch c;
if (regex_search(rev, c, rx))
{
T2 = c.str();
reverse(T2.begin(), T2.end());
T2 = T2.substr(T2.size() - 2, T2.size());
m.push_back(stoi(T2.c_str()));//字符串转数字并存放于数组中
}
}
}
catch (const fs::filesystem_error& e) {
cerr << "文件异常: " << e.what() << endl;
}
catch (const exception& e) {
cerr << "这里有一个意外发生: " << e.what() << endl;
}
return m;
}
//2.打开动态数组,找出缺少的项
void CZ(const vector<int>& v) {
int sym;
cout << "请输入预估的样本总量(不超过100): ";
cin >> sym;
vector<int> v2(sym, 1); // 初始化为1,表示所有数字都缺失
vector<int> v3; // 存放丢失的数据
for (int num : v) {
if (num > 0 && num <= sym) {
v2[num - 1] = 0; // 标记已找到的数字
}
}
// 打印丢失的数据
cout << "缺失的样本为:" << endl;
for (int i = 0; i < sym; ++i) {
if (v2[i] == 1) {
cout << i + 1 << " ";
v3.push_back(i + 1); // 将缺失的数字存储起来
}
}
cout << endl;
cout << "当前缺失的总量为: " << count(v2.begin(), v2.end(), 1) << endl;
cout << endl;
}
int main()
{
vector<int> m;
cout << "*********欢迎使用文件查漏系统**********" << endl;
cout << "***************************************" << endl;
m = TQ(m);
CZ(m);
cout << "**********程序结束*********" << endl;
}
注意:filesystem头文件使用需要在项目设置C++17以上的协议