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

时间:2018-01-25 18:43:04

标签: c

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

我有一个特定的途径,需要保存和加载二进制文件,您可以在我的代码中看到。到目前为止,我已经写了一些回复的东西,但是如果我正朝着正确的方向前进,我希望得到某人的意见,我的问题是如何将我的地下城写入二进制文件?我怎么读我的地下城把它放到二进制文件中?我的fopen声明也出现了错误,这是关于二进制操作数声明的,但我不确定它是什么意思。任何建议表示赞赏。我只发布主函数的代码,因为需要加载和保存,因为我需要获取命令行参数(--save和{{1} }),但是如果你需要查看关于地牢生成方式的整个代码,我将编辑我的帖子。

--load

1 个答案:

答案 0 :(得分:1)

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

我想评论一下您在main函数中所做的一些事情。该 评论部分对此很小。

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

这本身并不正确,但应该检查是否存在参数 一点都不如果用户没有通过参数,argv[1]将是NULL和您的。{1}} 程序会崩溃。这样更好:

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,那么条件是 否则评估为truefalse。如果该值不是标量值,则 编译器会打印一条错误消息。

    第二个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;
    }