【问题标题】:How to make a unique name for each file in C?如何为C中的每个文件创建一个唯一的名称?
【发布时间】:2015-12-02 16:38:36
【问题描述】:

你今天好吗。我有一个关于文件名处理的问题:D。我的代码不想工作,它给了我错误的分割

这个想法是创建唯一的文件名并创建它如果同名的文件已经存在。第一个是没有文件的异常,所以 for 循环从 1 而不是 0 开始。

unistd.h 是必需的!

char fileName[15][100];
sprintf(fileName[0],"output.txt");
FILE *output;

   for(int i = 1 ;i < 100; i++){
        sprintf(fileName[i],"Output%d.txt",i+1);

        //File exists
        if(!access(fileName[i],F_OK))
        {
            //Create and open a file
            output = fopen(fileName[i], "w");
            break;
        }    
    }

我只需要创建一个 try 函数(比如 while),直到它找到未被占用的名称。我只是将 for 循环放在那里以限制为 100。

【问题讨论】:

  • 那么你的问题是什么?
  • "创建它如果同名文件已经存在。"如果同名文件已经存在,那么它不存在独一无二。
  • 你真的需要阅读指针。 &amp;fileName[i]?你不断地用新的东西覆盖你的fileName 字符串的一部分。和fileName is a string, not an array of strings. fileName[i]` 没有意义
  • fileName 是一个字符串数组。问题是它被视为单个字符串(将char** 传递给sprintf 而不是char*),如果不是警告,这应该是一个错误。也没有为字符串本身分配空间。
  • ..啊...又一个没有为字符串分配空间并且对分段错误感到惊讶的人...你们不了解堆和malloc吗?跨度>

标签: c file


【解决方案1】:

你必须为字符串分配内存。

例子

char** fileName;
int Number_Of_Strings, String_Length, i;
fileName = malloc(Number_Of_Strings * sizeof(char*));

for ( i = 0; i < Number_Of_String; i++)   // For each string
    fileName = malloc(String_Length * sizeof(char));

Number_If_Strings :您需要多少个字符串? String_Length : 每个字符串的长度

【讨论】:

  • 谢谢,但我不想分配任何东西。我已经在程序中分配了几乎所有的变量,所以我想让它保持静态。谢谢建议
【解决方案2】:

你有什么:

char* fileName[100];

...是一个包含 100 个字符指针的数组。但是,您并没有为实际的字符串本身腾出空间。

当你这样做时:

sprintf(&fileName[0],"output.txt");

...您将“output.txt”写入文件名 [0] 中的地址所指向的位置,很可能是 0x0 或某个随机值,具体取决于您的编译器以及您是在堆栈还是堆上分配数组等。这通常会导致分段违规并且您的程序终止。

【讨论】:

    【解决方案3】:

    您没有为要指向的指针数组分配任何内存。你的语法也有点偏离这里和那里。这个简单的示例展示了如何为字符串数组分配内存、分配一些值、打印它们并释放内存。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXNAMES 10
    #define MAXLEN   32
    
    int main(void)
    {
        char* fileName[MAXNAMES];
        int i;
    
        for(i=0; i<MAXNAMES; i++)
            if ((fileName[i] = malloc(MAXLEN)) == NULL)
                exit(1);
    
        sprintf(fileName[0],"Output.txt");     // your first name is an exception    
        for(i = 1; i<MAXNAMES; i++)            // the rest of the names
            sprintf(fileName[i], "Output%d.txt", i+1);    // using your offset of 1
    
        for(i = 0; i<MAXNAMES; i++)
            printf("%s\n", fileName[i]);
    
        for(i = 0; i<MAXNAMES; i++)
            free(fileName[i]);
    
        return 0;   
    }
    

    程序输出:

    Output.txt
    Output2.txt
    Output3.txt
    Output4.txt
    Output5.txt
    Output6.txt
    Output7.txt
    Output8.txt
    Output9.txt
    Output10.txt
    

    【讨论】:

    • 等一下,你一口气完成了所有这些吗?我对吗?我只需要一个 try 函数(比如 while),直到它找到未被占用的名称。我只是将 for 循环放在那里以限制为 100。
    • @RandomNoob 这是一个简化的示例,向您展示如何使用字符串数组。它不是为了实现您的确切问题,因为我没有您正在使用的库函数。
    • 最有趣的一点是,我有一段半年前写的工作代码,我就是无法修改它
    • @RandomNoob 我很高兴你觉得浪费每个人的时间很有趣,当他们试图帮助你时却把他们放下。我现在笑得很开心。
    • 为什么浪费时间。二还是要找出造成分割的实际问题。我不是想侮辱你。感谢您抽出宝贵的时间,我真的很感激!刚刚在听课,结果以-5分回来,我肯定会不高兴的
    猜你喜欢
    • 2020-05-25
    • 2014-07-27
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多