关于使用相似名称在c编程中保存文本文件

关于使用相似名称在c编程中保存文本文件,c,file,C,File,我想用c编程保存文件,文件名如下: 如果game1.txt不存在,则应为game1.txt 如果game1.txt存在,则应为game2.txt 如果game2.txt存在,则应为game3.txt 等等。。。 那么,如果您想随身携带,我应该怎么做呢??: 使用循环和计数器 sprintf()格式字符串为“game%d.txt”的文件名 fopen()用于读取的文件 如果成功:关闭它并继续 如果失败:退出循环并打开文件进行写入 请注意,存在一个争用条件:如果打开以进行读取失败,则另一

我想用c编程保存文件,文件名如下:

  • 如果game1.txt不存在,则应为game1.txt
  • 如果game1.txt存在,则应为game2.txt
  • 如果game2.txt存在,则应为game3.txt
  • 等等。。。
    那么,如果您想随身携带,我应该怎么做呢??

    • 使用循环和计数器
    • sprintf()
      格式字符串为“game%d.txt”的文件名
    • fopen()
      用于读取的文件
      • 如果成功:关闭它并继续
      • 如果失败:退出循环并打开文件进行写入
    请注意,存在一个争用条件:如果打开以进行读取失败,则另一个进程可以在打开以进行写入之前创建该文件

    fopen()
    mode标志“x”有一个GNU扩展,用于独占打开。使用此选项将消除竞争条件。

    从这里的问题来看,最好的解决方案似乎是使用
    unistd.h
    标题中的
    access()
    函数

    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>
    
    const size_t MAX_FILENAME_LENGTH = 12;
    const int MAX_FILENAME_TRIES = 1000;
    
    char *get_next_filename()
    {
        char *filename = malloc(MAX_FILENAME_LENGTH);
        FILE *file;
        int found = 0, i = 0;
    
        do {
            snprintf(filename, "game%d.txt");
            if (access(filename, F_OK) < 0) { //if file does not exist, we've found our name!
                found = 1;
            } else {
                ++i;
            }
        } while (! found && i < MAX_FILENAMES_TRIES);
        return filename;
    }
    
    #包括
    #包括
    #包括
    常量大小\u t最大\u文件名\u长度=12;
    const int MAX_FILENAME_trys=1000;
    char*get_next_filename()
    {
    char*filename=malloc(最大文件名长度);
    文件*文件;
    int=0,i=0;
    做{
    snprintf(文件名,“游戏%d.txt”);
    如果(access(filename,F_OK)<0){//如果文件不存在,我们找到了我们的名字!
    发现=1;
    }否则{
    ++一,;
    }
    }而(!found&&i

    此处的代码以C字符串形式返回下一个可用的文件名,从
    game0.txt
    到gameN.txt,其中N是MAX_filename_TRIES的值。使用完文件名后,不要忘记
    free()
    文件名。

    x
    标志是C11中定义的
    fopen()
    函数的一部分,也是C11附录K.3.5中记录的
    fopen_()
    函数的一部分。因此,如果您使用
    fopen_s()
    ,它甚至可能在Windows上可用。如果您要使用POSIX
    access()
    ,则值得避免POSIX
    open()
    O|u EXCL | O_create
    在标志中的竞争条件,因此,如果文件不存在,它将创建该文件,但如果没有TOCTU,它将失败(检查时间,使用时间)漏洞。您可以使用
    fdopen()
    将文件描述符(
    int
    )转换为文件流(
    file*
    )。这类似于
    mkstemp()
    -它创建文件并返回文件描述符。最好将名称的空格传递到函数中,而不是强制使用
    malloc()
    free()
    ;代码不会泄漏。