gpt4 book ai didi

c++ - 为什么 vector 总是空的?

转载 作者:行者123 更新时间:2023-11-28 06:04:31 25 4
gpt4 key购买 nike

因此,程序将文件夹路径作为命令行选项,然后读取文件夹中的所有文件,如果文件内容正确(应该是一个整数),则输出文件名和一个整数(例如:test.txt : 192 ), check()函数判断文件数据是否正确。

打印完所有好文件后,我也想打印所有坏文件。所以我尝试在 vector<string> 中收集他们的名字,但不幸的是它始终是空的。所有逻辑都在 print() 函数中,因为程序应该使用多线程处理文件。当我不使用线程时,一切正常。

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iomanip>
#include<regex>
#include<boost/algorithm/algorithm.hpp>
#include<boost/range/algorithm.hpp>
#include<boost/filesystem.hpp>
#include<locale>
#include<thread>

using std::cout;
using std::endl;
using namespace boost::filesystem;
using vec = std::vector<std::string>;
static int summ = 0;
static vec vc;

inline auto check(const std::string &s)
{
std::regex reg1("[[:blank:]]*[-[:digit:]]*[[:blank:]]*", std::regex_constants::ECMAScript);
return regex_match(s, reg1);
}

void print(boost::filesystem::directory_entry &dir,std::vector<std::string> &v)
{
std::ifstream is;
is.open(dir.path().string());
std::stringstream buf;
buf << is.rdbuf();
auto temp = buf.str();
if(!check(temp))
{
vt.push_back(dir.path().filename().string());
is.clear();
is.close();
return;
}
cout.setf(std::ios::left, std::ios::adjustfield);
cout << std::setw(20) << dir.path().filename().string() << ": " << std::stoi(temp) << endl;
is.clear();
is.close();
}


int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
int sum{};
std::vector<std::string> vt;
std::ifstream file;

if (argc < 2)
{
cout << "usage: prog path" << endl;
return 1;
}

boost::filesystem::path p(argv[1]);

if (!boost::filesystem::is_directory(p))
{
cout << "not a directory!";
return 1;
}
for (auto &el : boost::filesystem::directory_iterator(p))
{
if (!boost::filesystem::is_directory(el))
{
std::thread tr(print, el,vc);
tr.join();
}

}
//cout << "Sum: " << sum << endl;
cout << "Files with wrong input data: \n";
boost::copy(vt, std::ostream_iterator<std::string>(cout, "\n")); //empty here
}

最佳答案

问题:

vt是空的,因为你永远不会向它添加任何东西。你路过 vc进入print .即使你路过 vt进入print ,它不会在您调用 push_back 时编译关于不存在的变量 vt里面print .你可能是说 v , 参数名称。

解决方案:

  1. 摆脱static vec vc;std::vector<std::string> vt;main
  2. 调用v.push_back而不是 vt.push_backprint

还有:

  1. std::vector.push_back 不是线程安全的,所以如果您同时在多个线程上访问它,您应该锁定...这不是因为:
  2. 您实际上并没有并行任何事情,因为您在启动每个线程后立即加入。
  3. 磁盘 IO 将成为瓶颈,因此即使您并行检查,也可能不会更快。

关于c++ - 为什么 vector 总是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32675292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com