【问题标题】:C++ multiple files with common name beginningC++ 多个文件以通用名称开头
【发布时间】:2014-12-22 10:34:51
【问题描述】:

有没有办法打开以通用名称开头的文件而不指定它们的全名和数量?它们应该一个一个地打开,而不是一次全部打开。 例如,我有文件: 确定str_123.txt,确定str_5329764.txt,确定str_1323852.txt。

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

【问题讨论】:

  • 注意:这个术语是 globbing(或“shell glob”)。此外,您不希望只是“通用名称开头”(顺便说一下,它被称为 prefix)。毕竟还有常见的后缀

标签: c++ file boost glob


【解决方案1】:

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 输出文件(当然这是一个hack)。

无论如何,根据您的需要,基于 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)]

这是https://stackoverflow.com/a/26585425/3235496的Python等价物

【讨论】:

  • 这是很多“密切引用”,但没有任何实际答案(simple_ls 示例不过滤模式,链接的答案显然是特定于平台的,黑客......疯狂的黑客)。提到 python 是......好吧,我猜 OP 要求这样做:/
  • @sehe 感谢您的观察。我添加了一些代码并更改了链接。
  • 等一下。这里发生了什么?您添加了我 5 小时前发布的代码示例,然后......我得到了反对。你知道,我很高兴你修改了答案。来自我的 +1。
  • @sehe 非常抱歉:downvote 不是我的,阅读您的回答我确信您使用的是 C++11 正则表达式,而不是 boost。是时候暂停了;)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2018-06-18
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多