Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;多个文件以公共名称开头_C++_File_Boost_Glob - Fatal编程技术网

C++ C++;多个文件以公共名称开头

C++ C++;多个文件以公共名称开头,c++,file,boost,glob,C++,File,Boost,Glob,有没有办法打开以公用名称开头的文件,而不指定其全名和数量?它们应该一个接一个地打开,而不是一下子全部打开。 例如,我有以下文件: certainstr_123.txt、certainstr_5329764.txt、certainstr_1323852.txt 或者,也许用另一种语言更容易做到? 谢谢。C++没有定义以那种方式列出文件的标准方式 最好的跨平台方法是使用模块之类的库。我认为boost::filesystem没有通配符搜索,您必须自己过滤文件,但这并不困难 您可以使用正则表达式,就像在

有没有办法打开以公用名称开头的文件,而不指定其全名和数量?它们应该一个接一个地打开,而不是一下子全部打开。 例如,我有以下文件: certainstr_123.txt、certainstr_5329764.txt、certainstr_1323852.txt

或者,也许用另一种语言更容易做到?
谢谢。

C++没有定义以那种方式列出文件的标准方式

最好的跨平台方法是使用模块之类的库。我认为
boost::filesystem
没有通配符搜索,您必须自己过滤文件,但这并不困难

您可以使用正则表达式,就像在另一个答案中一样(这是完美的解决方案)。 检查文件扩展名(
i->path().extension()
)和以“certainstr”开头的文件名(
boost::start_with
std::string::substr
)可能就足够了。 如果选择C++11标准正则表达式库,请确保具有最新的
libstdc++

有许多特定于系统的功能。例如,见:

对于一些Unix/Windows示例

您也可以尝试(Windows)之类的操作:

或(Unix):

解析
list.txt
输出文件(当然这是一种黑客行为)

无论如何,根据您的需要,基于Python(或基于脚本)的解决方案可能更简单(另请参见):

或者:

files = [f for f in os.listdir('.') if re.match(r'certainstr_\d+.txt', f)]

这是Python的等价物,我建议只使用正则表达式。伪代码:

boost::regex reg("^certainstr_\\d+.txt$");
for(recursive_directory_iterator it("."); it != recursive_directory_iterator(); ++it)
{
    if(boost::regex_search(it->string(), reg))
    {
        cout << *it << endl;
    }
}
boost::regex reg(“^certainstr\\ud+.txt$”;
for(递归目录迭代器it(“.”;it!=递归目录迭代器();++it)
{
if(boost::regex_搜索(it->string(),reg))
{

难道不是有很多“密切的参考”,但没有什么真正的答案(简单的示例不过滤模式,链接的答案明确是特定于平台的,黑客……疯狂的黑客)。提到python是……嗯,我想OP是这样要求的:/@sehe谢谢你的观察。我添加了一些代码并更改了一个链接。等等。这里发生了什么事?你添加了我5小时前发布的代码示例,我得到了否决票。你知道,我很高兴你修改了你的答案。@sehe双重抱歉:否决票不是我的,读你的答案时,我确信你使用的是C++11正则表达式,不是boost。是时候暂停了;)注意:这个术语是globbing(或“shell globs”)。另外,你不想只使用“公共名称开头”(顺便说一句,它被称为前缀)。毕竟,还有公共后缀。
[glob.glob('certainstr_*.txt')][3]
files = [f for f in os.listdir('.') if re.match(r'certainstr_\d+.txt', f)]
boost::regex reg("^certainstr_\\d+.txt$");
for(recursive_directory_iterator it("."); it != recursive_directory_iterator(); ++it)
{
    if(boost::regex_search(it->string(), reg))
    {
        cout << *it << endl;
    }
}