关于使用相似名称在c编程中保存文本文件
我想用c编程保存文件,文件名如下:关于使用相似名称在c编程中保存文本文件,c,file,C,File,我想用c编程保存文件,文件名如下: 如果game1.txt不存在,则应为game1.txt 如果game1.txt存在,则应为game2.txt 如果game2.txt存在,则应为game3.txt 等等。。。 那么,如果您想随身携带,我应该怎么做呢??: 使用循环和计数器 sprintf()格式字符串为“game%d.txt”的文件名 fopen()用于读取的文件 如果成功:关闭它并继续 如果失败:退出循环并打开文件进行写入 请注意,存在一个争用条件:如果打开以进行读取失败,则另一
那么,如果您想随身携带,我应该怎么做呢??:
- 使用循环和计数器
格式字符串为“game%d.txt”的文件名sprintf()
用于读取的文件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上可用。如果您要使用POSIXaccess()
,则值得避免POSIXopen()
和O|u EXCL | O_create
在标志中的竞争条件,因此,如果文件不存在,它将创建该文件,但如果没有TOCTU,它将失败(检查时间,使用时间)漏洞。您可以使用fdopen()
将文件描述符(int
)转换为文件流(file*
)。这类似于mkstemp()
-它创建文件并返回文件描述符。最好将名称的空格传递到函数中,而不是强制使用malloc()
和free()
;代码不会泄漏。