很久以前,因为我试图编码......但我正在寻找一种简单的方法来迭代一些文件夹来重命名包含文件。
我的文件夹看起来像'MORE0001','MORE0002'等。它们包含所有同名文件'Data'
我想要做的是将所有包含的文件重命名为'data.dat'(并且可能找到一种从文件夹中提取文件的方法..)
所以这就是它的样子:
for (int i=0; i<10;i++){
char oldname[]= "directory/MORE0001/data";
char newname[]= "directory/MORE0001/data.dat";
rename(oldname,newname);
}
这很好用,但我想将for循环中的0001
更改为0002
等。
希望你们能帮助我..我还没有找到这个简单问题的答案
答案 0 :(得分:2)
如果要使用C解决它,可以使用以下语句生成字符串(应该先使用char oldname [100]之类的方式声明):
instance2.hashCode()
与newname相同。
答案 1 :(得分:1)
其他答案向您展示了如何在C中使用(?<=_)[A-Za-z-]*
,但您也将问题标记为c++。在C ++中,您应该使用sprintf()
代替,例如:
std::ostringstream
也就是说,您应该考虑删除基于整数的循环,并实际枚举根#include <string>
#include <sstream>
#include <iomanip>
#include <cstdio>
for (int i = 0; i < 10; ++i)
{
std::ostringstream oss;
oss << "directory/MORE" << std::setw(4) << std::setfill('0') << i << "/data";
std::string oldname = oss.str();
std::string newname = oldname + ".dat";
std::rename(oldname.c_str(), newname.c_str());
}
的内容以动态发现其子文件夹。您可以使用类似boost::filesystem
的内容(也有自己的rename()
功能),甚至可以使用特定于平台的API(例如FindFirstFile()
/ FindNextFile()
和{{ 3)}在Windows上。)
答案 2 :(得分:0)
使用SELECT w.worker_id, w.department, [ complicated equation using location, destination, departure and arrival time] AS mph
FROM workers w
CROSS JOIN (
SELECT department,
[ complicated equation using location, destination, departure and arrival time (by workers) ] AS mph1,
[ complicated equation using location, destination, departure and arrival time (by w3) ] AS mph3
FROM workers
JOIN workers w3 ON w3.worker_id <> workers.worker_id
AND w3.department = workers.department
HAVING mph1 < 500
AND mph3 < 500
ORDER BY mph1
LIMIT 1
) w2
WHERE w.department = w2.department
HAVING mph < 500
ORDER BY mph
LIMIT 2
格式化打印到缓冲区,您可以将其传递到sprintf
函数。
在rename
中,您可以在for循环中使用sprintf
作为%04d
的格式说明符,这将在您的号码后打印前导零,最多4位数。
答案 3 :(得分:0)
使用sprintf
:
char oldname[100];
char newname[100];
sprintf(oldname, "directory/MORE%04d/data", i);
sprintf(newname, "directory/MORE%04d/data.dat", i);
100应足够大以容纳路径名。如果它太短,您的程序将崩溃或(更糟糕的是)将您的文件重命名为无法使用的名称。