gpt4 book ai didi

c - 将二进制文件写入特定目录(路径)

转载 作者:行者123 更新时间:2023-11-30 19:06:15 25 4
gpt4 key购买 nike

所以我有代码生成一个伪随机地牢,其中房间是矩形的,由句点 ('.') 组成,而走廊则由哈希符号 (' #'),所以当我在终端内运行程序时,它将在该终端内生成一个地牢,但我现在的目标是将这个地牢保存到一个可以读回的二进制文件中,必须保存该文件并加载文件。

我有一个需要保存和加载二进制文件的特定路径,您可以在我的代码中看到。到目前为止,我已经写了一些后面的内容,但是如果我朝着正确的方向前进,我想得到某人的输入,我的问题是如何将我的地下城写入二进制文件?我如何读取我的地牢并将其放入二进制文件中?我的 fopen 语句也出现错误,与二进制操作数语句有关,但我不确定它的含义。任何建议表示赞赏。我只会发布主函数的代码,因为这是需要进行加载和保存的地方,因为我需要采用命令行参数(--save--加载),但如果您需要查看有关地牢如何生成的完整代码,我将编辑我的帖子。

int main(int argc, char *argv[]) {
char *ptr_path_home;
char *directory;
action_t action;

ptr_path_home = getenv("HOME");
directory = ".rlg327/";

char *pathway = malloc(strlen(ptr_path_home) + strlen(directory) + 1);

strcpy(pathway, ptr_path_home);
strcat(pathway, directory);



FILE *f;

if (strcmp(argv[1], "--save") == 0)
{
action = write_binary;
}

if (action = write_binary)
{
f = fopen(pathway + "save.bin", "wb");
}





srand(time(NULL));
createDungeon();
return 0;
}

最佳答案

因为你还没有向我们展示你 build 地牢的方式等等重要的是你使用的数据结构,不可能给你一个对此的明确答案。评论对你有很好的建议。

我想评论一下您在 main 函数中所做的一些事情。这评论部分对此来说太小了。

if (strcmp(argv[1], "--save") == 0)
{
action = write_binary;
}

这本身并不错误,但您应该检查是否存在参数根本不。如果用户没有传递参数,argv[1] 将为 NULL 并且您的程序会崩溃。这样更好:

int main(int argc, char **argv)
{
// argv[0] contains the name of the program,
// if user executes your program like this:
// ./yourprogram arg1 arg2 ... argv[0] will be
// ./yourprogram
if(argc != 2)
{
fprintf(stderr, "usage: %s [--save | --load]\n", argv[0]);
return 1;
}

// now is safe to do this
if (strcmp(argv[1], "--save") == 0)
{
action = write_binary;
}

...

return 0;
}

如果你的程序最终需要更多参数,最好使用助手功能类似于 getopt 。这让生活变得更加轻松。

if (action = write_binary)
{
f = fopen(pathway + "save.bin", "wb");
}

这里有 2 个错误:

  1. if(action = write_binary)if(action == write_binary) 不同。第一个将 write_binary 的值分配给 action,该值是0 以外的标量(可以转换为数字),则条件为评估为 true,否则评估为 false。如果该值不是标量值,则编译器将打印一条错误消息。

    第二个if比较actionwrite_binary是否相同。那是很可能是您想要的。

  2. pathway + "save.bin" 不会连接字符串。没有原生类型对于 C 语言中的字符串,例如 C++ 的 std::string 或 Python 的 String。 C 中的字符串是以字节值 '\0' (==0) 结尾的字节序列。你通常使用 char 数组或指向 char 数组的指针来保存字符串。

    字符串文字(带引号的字符串)实际上返回一个指针到保存字符串的只读位置。请注意

    const char *str = "hello";

    不会将字符串分配给str,而是分配“hello”所在的地址存储。这就是为什么您总是需要像 strcpy 这样的函数来复制字符串。

    你应该这样做:

    int main(int argc, char **argv)
    {
    ...
    FILE *f = NULL;

    char *ptr_path_home;
    const char *directory;
    const char *basename = "save.bin"

    ptr_path_home = getenv("HOME");
    directory = ".rlg327";

    char *pathway = malloc(strlen(ptr_path_home) + strlen(directory) +
    strlen(basename) + 3);

    // +3 because you need 2 slashes and the 0-terminating byte

    sprintf(pathway, "%s/%s/%s", ptr_path_home, directory, basename);
    ...

    if(action == write_binary)
    {
    // save file
    f = fopen(pathway, "wb");
    if(f == NULL)
    {
    free(pathway);
    perror(pathway);
    return 1;
    }
    ...
    fclose(f);

    }

    free(pathway);
    return 0;
    }

关于c - 将二进制文件写入特定目录(路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com