在桌面上创建多个随机命名的文件不适用于 C++
Creating multiple randomly named files on a desktop doesn't work with C++
这个程序应该在桌面上创建 10 个随机命名的文件,名称为 unicode 字符串,但它只创建了 1 个。我尝试在 createfiles
函数末尾使用 delete[] 语句来释放内存输出,文件和桌面,但它仍然不起作用。我做错了什么吗?
#include "shlobj_core.h"
#include <fstream>
#include <iostream>
#include <Windows.h>
wchar_t* generateRandomUnicodeString(size_t len, size_t start, size_t end)
{
wchar_t* ustr = new wchar_t[len + 1];
size_t intervalLength = end - start + 1;
srand(time(NULL));
for (auto i = 0; i < len; i++) {
ustr[i] = (rand() % intervalLength) + start;
}
ustr[len] = L'[=10=]';
return ustr;
}
void createfiles(int number)
{
if (number == 0) {
return;
}
wchar_t* output = generateRandomUnicodeString(5, 0x0400, 0x04FF);
LPWSTR desktop;
LPWSTR file;
SHGetKnownFolderPath(FOLDERID_Desktop, 0, 0, &desktop);
PathAllocCombine(desktop, output, 0, &file);
std::wofstream ofs(file);
ofs << "File Description";
delete[] output;
output = nullptr;
delete[] file;
file = nullptr;
delete[] desktop;
desktop = nullptr;
createfiles(number - 1);
}
int main()
{
createfiles(10);
return 0;
}
如果函数调用 time(NULL)
在同一秒内执行了多次(这可能发生在您的情况下),那么它每次都会 return 相同的值。
这意味着每次尝试生成随机字符串时,您都在使用相同的值为随机数生成器播种。因此,rand
每次都会生成相同的随机数序列。这意味着每次调用函数 generateRandomUnicodeString
.
时都会生成相同的随机字符串
如果您尝试创建同一个文件名 10 次,那么只有第一次会成功,其余 9 次都会失败,因为该文件已经存在。
因此,解决您问题的最简单方法是在您的程序中仅调用一次 srand
,而不是每次调用 generateRandomUnicodeString
时。这最好在函数 main
.
的开头完成
这样,如果您在同一秒内多次调用 main
(即如果您在同一秒内启动程序两次),您只会遇到生成相同随机数序列的问题.如果您在同一秒内多次调用 generateRandomUnicodeString
将不再是问题。
这个程序应该在桌面上创建 10 个随机命名的文件,名称为 unicode 字符串,但它只创建了 1 个。我尝试在 createfiles
函数末尾使用 delete[] 语句来释放内存输出,文件和桌面,但它仍然不起作用。我做错了什么吗?
#include "shlobj_core.h"
#include <fstream>
#include <iostream>
#include <Windows.h>
wchar_t* generateRandomUnicodeString(size_t len, size_t start, size_t end)
{
wchar_t* ustr = new wchar_t[len + 1];
size_t intervalLength = end - start + 1;
srand(time(NULL));
for (auto i = 0; i < len; i++) {
ustr[i] = (rand() % intervalLength) + start;
}
ustr[len] = L'[=10=]';
return ustr;
}
void createfiles(int number)
{
if (number == 0) {
return;
}
wchar_t* output = generateRandomUnicodeString(5, 0x0400, 0x04FF);
LPWSTR desktop;
LPWSTR file;
SHGetKnownFolderPath(FOLDERID_Desktop, 0, 0, &desktop);
PathAllocCombine(desktop, output, 0, &file);
std::wofstream ofs(file);
ofs << "File Description";
delete[] output;
output = nullptr;
delete[] file;
file = nullptr;
delete[] desktop;
desktop = nullptr;
createfiles(number - 1);
}
int main()
{
createfiles(10);
return 0;
}
如果函数调用 time(NULL)
在同一秒内执行了多次(这可能发生在您的情况下),那么它每次都会 return 相同的值。
这意味着每次尝试生成随机字符串时,您都在使用相同的值为随机数生成器播种。因此,rand
每次都会生成相同的随机数序列。这意味着每次调用函数 generateRandomUnicodeString
.
如果您尝试创建同一个文件名 10 次,那么只有第一次会成功,其余 9 次都会失败,因为该文件已经存在。
因此,解决您问题的最简单方法是在您的程序中仅调用一次 srand
,而不是每次调用 generateRandomUnicodeString
时。这最好在函数 main
.
这样,如果您在同一秒内多次调用 main
(即如果您在同一秒内启动程序两次),您只会遇到生成相同随机数序列的问题.如果您在同一秒内多次调用 generateRandomUnicodeString
将不再是问题。