C中的变量文件名中的%d

时间:2014-10-14 11:15:50

标签: c

制作记录数据的程序。我希望它在每次达到文件空间的设置限制(以字节为单位)时以递增的整数开始一个新文件。

在我使用之前一切正常:

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
    ...
    ...
    ...
}

我最初尝试使用时间戳,但这并没有奏效并将其带回基础。

2 个答案:

答案 0 :(得分:7)

fopenopen等...的文件路径是一个字符串。您可以构建该字符串,例如使用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")或其他。

相关问题