所以我有代码生成一个伪随机地牢,其中房间是矩形的,由句点('.'
)组成,而走廊由哈希符号('#'
)组成,所以当我在终端内运行我的程序,它会在这个终端内生成一个地牢,但我现在的目标是将这个地牢保存到一个可以回读的二进制文件中,这对于保存文件和加载文件至关重要。
我有一个特定的途径,需要保存和加载二进制文件,您可以在我的代码中看到。到目前为止,我已经写了一些回复的东西,但是如果我正朝着正确的方向前进,我希望得到某人的意见,我的问题是如何将我的地下城写入二进制文件?我怎么读我的地下城把它放到二进制文件中?我的fopen声明也出现了错误,这是关于二进制操作数声明的,但我不确定它是什么意思。任何建议表示赞赏。我只发布主函数的代码,因为需要加载和保存,因为我需要获取命令行参数(--save
和{{1} }),但是如果你需要查看关于地牢生成方式的整个代码,我将编辑我的帖子。
--load
答案 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个错误:
if(action = write_binary)
与if(action == write_binary)
不同。
第一个将write_binary
的值分配给action
,该值为
标量(可以转换为数字)而不是0,那么条件是
否则评估为true
,false
。如果该值不是标量值,则
编译器会打印一条错误消息。
第二个if
比较action
和write_binary
是否相同。那是
最有可能是你想要的。
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;
}