为什么 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
,参数的名称。
解决方案:
- 删除
main
中的 static vec vc;
或 std::vector<std::string> vt;
- 在
print
中调用 v.push_back
而不是 vt.push_back
还有:
- std::vector.push_back 不是线程安全的,所以如果你同时在多个线程上访问它,你应该锁定......你不是因为:
- 你实际上并没有并行化任何东西,因为你在启动每个线程后立即加入。
- 磁盘 IO 将成为瓶颈,因此即使您并行检查,也可能不会更快。
因此,程序将文件夹的路径作为命令行选项,然后读取文件夹中的所有文件,如果文件内容正确(应该是一个整数),则输出文件名和一个整数(示例: 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
,参数的名称。
解决方案:
- 删除
main
中的 - 在
print
中调用
static vec vc;
或 std::vector<std::string> vt;
v.push_back
而不是 vt.push_back
还有:
- std::vector.push_back 不是线程安全的,所以如果你同时在多个线程上访问它,你应该锁定......你不是因为:
- 你实际上并没有并行化任何东西,因为你在启动每个线程后立即加入。
- 磁盘 IO 将成为瓶颈,因此即使您并行检查,也可能不会更快。