制作记录数据的程序。我希望它在每次达到文件空间的设置限制(以字节为单位)时以递增的整数开始一个新文件。
在我使用之前一切正常:
file_name = ("Data%d.bin",fileIncrement);
而不是:
file_name = "Data.bin";
当我更换上述内容时,软件不再写入文件。
这是有问题的功能:
char *file_name;
static int fileSize = 0; //bytes
static int fileIncrement = 1;
//Set file name
if (fileSize == 0)
{
file_name = ("Data%d.bin",fileIncrement);
++fileIncrement;
}
fileSize += size;
if (fileSize >= 1024)
{
fileSize = 0;
}
// Write to file system
...
...
...
}
我最初尝试使用时间戳,但这并没有奏效并将其带回基础。
答案 0 :(得分:7)
fopen
,open
等...的文件路径是一个字符串。您可以构建该字符串,例如使用snprintf
,例如。
char filepath[256];
snprintf (filepath, sizeof(filepath), "Data%d.bin", fileIncrement);
FILE * fil = fopen(filepath, "w");
if (!fil) { perror(filepath); exit(EXIT_FAILURE); };
阅读您正在使用的每项功能的fopen(3),perror(3),exit(3),snprintf(3)和的文档 - ;你需要添加更多的#include
指令。
避免使用sprintf
(但使用snprintf
),因为您应该害怕buffer overflow和其他undefined behavior。
您甚至可以测试snprintf
的结果,以确保它成功并适合filepath
。
在编译时,启用调试信息和所有警告(例如,如果使用GCC,则使用gcc -Wall -g
进行编译)。然后使用调试器(例如gdb
)
答案 1 :(得分:7)
很多人似乎认为这只是因为你可以做到
printf("%d", 4711);
要打印整数,您应该可以使用("%d", 4711)
任何地方将整数格式化为字符串。
这不是真的,而不是C的工作方式。在C中,函数执行此类工作,此处的函数当然是printf()
,这意味着"打印,格式化"。
您可以使用其他功能在不打印的情况下进行格式化,例如snprintf()
:
char buf[32];
snprintf(buf, sizeof buf, "Data%d.bin", fileIncrement);
然后将buf
传递给执行开场的函数,即fopen(buf, "rb")
或其他。