C ++多个文件,通用名称以

时间:2014-10-27 09:19:16

标签: c++ file boost glob

有没有办法打开具有通用名称的文件而不指定其全名和金额?它们应该一个接一个地打开,而不是一次打开。 例如,我有文件: certainstr_123.txt,certainstr_5329764.txt,certainstr_1323852.txt。

或者,也许,用另一种语言可以更轻松地完成它? 谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

有很多系统特定的功能。例如。见:

对于某些Unix / Windows示例。

你也可以试试(Windows):

std::system("dir /b certainstr_*.txt > list.txt");

或(Unix):

std::system("ls -m1 certainstr_*.txt > list.txt");

解析list.txt输出文件(当然这是一个黑客攻击)。

无论如何,根据您的需要,基于Python(或基于脚本)的解决方案可能更简单(另请参阅How to list all files of a directory?):

[glob.glob('certainstr_*.txt')][3]

或者:

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

这是Python的等同于https://stackoverflow.com/a/26585425/3235496

答案 1 :(得分:1)

我建议只使用正则表达式。伪代码:

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;
    }
}