我正在使用向量将文件的名称检索到路径中。 我只想获取某种类型的文件。这就是为什么我试图使用.find来检测文件是否具有 conllu 格式。我想找出一个字符串是否包含“ conllu”
void read_directory(const std::string& name, stringvec& v)
{
std::string pattern(name);
pattern.append("\\*");
WIN32_FIND_DATA data;
HANDLE hFind;
if ((hFind = FindFirstFile(pattern.c_str(), &data)) != INVALID_HANDLE_VALUE) {
while (FindNextFile(hFind, &data) != 0) {
v.push_back(data.cFileName);
}
FindClose(hFind);
}
}
std::vector<std::string> v;
std::vector<std::string>::iterator it;
read_directory("path", v);
it = find(v.begin(), v.end(), ".conllu");
if (it != v.end())
std::cout << "Element found in myvector: " << *it << '\n';
向量中文件名的示例:
.gitignore
CONTRIBUTING.md
el_gdt-ud-dev.conllu
答案 0 :(得分:2)
如果要检查std::vector<std::string>
是否包含特定的std::string
,则只需执行以下操作:
bool contains(const std::string & word, const std::vector<std::string> & set)
{
bool found(false);
for(size_t i = 0; !found && (i < set.size()); ++i)
{
if(set[i] == word)
found = true;
}
return found;
}
现在,如果您要检查std::string
是否包含特定的“子字符串”,则更加复杂。
我这样做是这样的:
bool contains(const std::string & pattern, const std::string & str)
{
bool found(false);
bool ongoing(false);
size_t cursor(0);
for(size_t i = 0; (!pattern.empty()) && !found && (i < str.length()); ++i)
{
if(ongoing)
{
if(str[i] == pattern[0])
{
cursor = 1;
}
else if(str[i] == pattern[cursor])
{
if(cursor == pattern.length()-1)
found = true;
else
++cursor;
}
else
{
ongoing = false;
cursor = 0;
}
}
else
{
if(str[i] == pattern[0])
{
if(pattern.size() == 1)
found = true;
else
{
ongoing = true;
++cursor;
}
}
}
}
return found;
}
我在所有情况下都对其进行了测试,并且成功运行了。
我希望它能提供帮助。
编辑:如果没有现成的库已经实现了这种功能,我会感到非常惊讶。但是,如果我们想自己实现它,这是一种实现方法。
答案 1 :(得分:1)
您需要在向量中的每个字符串中搜索子字符串.conllu
。我建议使用一个循环和std::string::find
。
#include <vector>
#include <string>
#include <iostream>
int main() {
std::vector<std::string> v = { "nope", "yes.conllu", "also.conllu", "nothere" };
for (auto& str : v) {
if (str.find(".conllu") != std::string::npos) {
std::cout << "Found .conllu in " << str << std::endl;
}
}
}