我有如下要求。我有一个目录,例如我有/ tmp / myFolder
在“myFolder”下,我的文件名称如下
myFile-N001.txt
myFile-N002.txt
myFile-N003.txt
在我的应用程序中写入文件时我应该写入/ tmp / myFolder中的最大数字文件,例如在上面的情况下我应该写入myFile-N003.txt。
上述内容应以C ++实现,并以便携式方式实现,最好采用POSIX方式。
任何人都可以举例说明我们如何在C ++中实现这一目标。
由于
答案 0 :(得分:3)
如果你满意的话:
您可以使用POSIX中的 glob()
功能获取列表。
然后你可以使用std :: max和结果集进行自定义比较,你的迭代器范围是globres.gl_pathv [0],globres.gl_pathv [globres.gl_pathc],比较类似于:
bool strless(const char* str1, const char* str2 )
{
return strcmp( str1, str2 ) < 0;
}
虽然很可能已经有了这样的事情
glob的“man”页面的开头:
#include <glob.h>
int glob(const char *pattern, int flags,
int (*errfunc) (const char *epath, int eerrno),
glob_t *pglob);
void globfree(glob_t *pglob);
<强>描述强>
glob()
函数根据shell使用的规则搜索匹配模式的所有路径名(请参阅glob
(7))。没有代字号扩展或参数替换
已经完成了;如果您需要这些,请使用wordexp
(3)。
globfree()
函数将之前调用的动态分配存储空间释放到glob()
。
glob()
调用的结果存储在pglob指向的结构中。此结构的类型为glob_t
(在<glob.h>
中声明),并包含以下元素
由POSIX.2定义(更多可能作为扩展名存在):
typedef struct
{
size_t gl_pathc; /* Count of paths matched so far */
char **gl_pathv; /* List of matched pathnames. */
size_t gl_offs; /* Slots to reserve in gl_pathv. */
} glob_t;
2004年10月有一个discussion关于将glob引入提升我认为它没有实现:
答案 1 :(得分:2)
有用于以符合POSIX标准的方式here从目录中检索文件列表的代码。
你可以通过对结果数组进行排序并弹出最后一个元素来构建它。那将是你想要找到的文件。
答案 2 :(得分:1)
您可以使用boost::filesystem来实现此目标。
答案 3 :(得分:1)
这实际上是两个问题。我将使用Boost.Filesystem来移植文件,并将它们存储在vector
中(未经测试)
std::string maxname;
unsigned maxnum = 0;
for (fs::path::iterator i(dir.begin()), end(dir.end()); i != end; ++i) {
std::string name = i->string();
unsigned num;
if (std::sscanf(name.c_str(), "myFile-N%u.txt", &num) == 1
&& num >= maxnum) {
maxnum = num;
maxname = name;
}
}
然后检查循环后maxname
是否包含空字符串。如果没有,它将保留您想要的文件名。