在桌面上创建多个随机命名的文件不适用于 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 将不再是问题。