为什么 vector 总是空的?

Why does vector always stay empty?

因此,程序将文件夹的路径作为命令行选项,然后读取文件夹中的所有文件,如果文件内容正确(应该是一个整数),则输出文件名和一个整数(示例: 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,它也不会编译,因为您在 print 中对不存在的变量 vt 调用 push_back。您可能是指 v,参数的名称。

解决方案:

  1. 删除 main
  2. 中的 static vec vc;std::vector<std::string> vt;
  3. print
  4. 中调用 v.push_back 而不是 vt.push_back

还有:

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