【问题标题】:Producing a random file name, and then creating the file, In C++生成一个随机文件名,然后在 C++ 中创建文件
【发布时间】:2016-09-05 02:37:27
【问题描述】:

在我的程序中,我试图生成一个随机文件名,然后使用 fopen 创建一个具有该名称的文件。流程如下

  1. 创建一个随机文件名
  2. 通过尝试在 c:\ 中创建具有该名称的文件来检查我们是否是管理员
  3. 将内容写入文件

我用来制作随机文件名的函数是:

const char *RandomName(const char *suffix,unsigned int length)
    {
        const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
        int stringLength = sizeof(alphanum) - 1;
        std::string Str;
        unsigned int i;
        Str.append("c:\\");
        for( i = 0; i < length; ++i)
        {
            Str += alphanum[rand() % stringLength];
        }
        Str += suffix;
        const char *str =Str.c_str();
        return str;
    }

我用来创建文件并检查管理员的功能是:

bool IsAdmin()
{
    const char *n = RandomName(".BIN",5);
    cout << n << endl;
    FILE *fp;
    fp = fopen((const char *)n,"w+");
    if (fp == NULL) {
        cout << "File pointer was NULL" << endl;
        return false;
    } else {
        cout << "File pointer is legit" << endl;
        //fclose(fp);
        //remove(n);
        int b;
        for(b = 0; b != 1338; b++)
        {
            char f = 'c';
            fputc(f, fp);
        }
        return true;
    }
}

以管理员身份运行时,程序会打印:

c:\9UswA.BIN 不是管理员!

如何让程序创建一个名称与屏幕上显示的名称相匹配的文件?并且没有粗略的行为?

【问题讨论】:

  • 这里有什么意义?创建临时文件或确定您是否以管理员权限运行?对于前者,请检查 tmpnam 或 tmpfile 或 GetTempFileName 函数。你用谷歌搜索过这个吗?
  • 我说的重点是,创建一个随机文件名和与之配套的文件,主要是检查程序是否以管理员身份运行。上面的代码也显示了这一点。
  • 您的 RandomName 函数正在返回一个指向函数本地 std::string 对象数据的指针。这个std::string 对象在函数结束时被销毁,此时返回的指针无效。为什么不直接返回std::string
  • 另外,名为prefix 的参数被用作后缀。前缀出现在开头。
  • @Benjamin 我不确定,我离一个好的编码员还很远。明天当我再次可以访问代码时,我会检查一下,非常感谢!您为什么不将其作为答案提交,以便我稍后选择它。我才意识到我把它叫做前缀,我一定是累了。我会把它改成后缀。

标签: c++ io file-handling


【解决方案1】:

简单 只需使用 tmpnam c api

示例:

#include <stdio.h>

  int main(void)
  {
    char name[40];
    int i;

    for(i=0; i<3; i++) {
      tmpnam(name);
      printf("%s ", name);
    }
    return 0;
  }

【讨论】:

    【解决方案2】:

    我认为以管理员身份运行此处创建的 .exe 可以让您创建文件。 不是从任何 IDE 运行程序,而是从文件位置手动运行并以管理员身份运行。

    【讨论】:

    • 我做到了,可执行文件在 IDE 之外以管理员模式运行。
    • 尝试在同一位置手动创建此文件。如果你能做到这一点,你的程序也可以。
    • 当我尝试在 C 驱动器中创建一个类似的文件时,它看起来不像我可以,所以我将源更改为 Str.append("c:\\Users\\UserName\\Desktop\\"); 以尝试让它写入我的位置被允许,但它仍然不起作用,我在 Windows 10 上。
    【解决方案3】:

    为了解决这个问题,我去掉了 RandomName 函数并编辑了 IsAdmin 以包含它的代码,经过一些调整,我至少能够让它工作得很好,我最终得到的代码是:

    void AdminWrite(const char *suffix,unsigned int length)
    {
        FILE *fp;
        const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
        int stringLength = sizeof(alphanum) - 1;
        std::string Str;
        unsigned int i;
    
        Str.append("c:\\Users\\UserName\\Desktop\\");
        for( i = 0; i < length; ++i)
        {
            Str += alphanum[rand() % stringLength];
        }
        Str += suffix;
        const char *str =Str.c_str();
        cout << str << endl;
        fp = fopen(str,"w+");
        if (fp == NULL) {
                cout << "File pointer was NULL" << endl;
                return;
        } else {
            cout << "File pointer is legit" << endl;
            int b;
            for(b = 0; b != 1337; b++)
            {
                char f = 'c';
                fputc(f, fp);
            }
            return;
        }
        return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多