【发布时间】:2016-03-17 11:48:35
【问题描述】:
我对 C 很陌生,我正在努力从我的 C 程序中写入文件。在这个程序中,我打开要读取的文件以及要写入的文件,所以我想我会创建一个为我打开文件的函数。这就是我所做的
FILE *open_file(char* filename, char* mode)
{
FILE *f;
f = fopen(filename, mode);
if(!f)
{
perror(filename)
exit(EXIT_FAILLURE);
}
return f;
}
这就是我调用函数的方式:
FILE *infile = open_file(args.infile_name, "r");
FILE *rm_file = open_file(args.rm_file, "r");
FILE *ex_file = open_file(args.ex_file, "w");
这些函数调用分布在整个程序中。首先我在那里硬编码了模式“r”,因为我只需要从文件中读取,但现在我也想为文件写,所以我为打开文件的方式做了一个参数。它以前工作得很好,但现在它什么也没做。我编译得很好,没有任何错误、警告和/或注释。 valgrind 也告诉我一切都很好。对此有什么想法吗?提前致谢。
编辑:我忘了添加我返回 f 的行,我现在添加了它。它已经在我的代码中了(当然,你不能让非 void 函数什么都不返回)。
编辑:对“错误”的更好解释:我正在尝试从文件中读取单词并将它们存储在树状数据结构中。这工作正常,我可以查找它们,所以这里没有问题。在树中添加单词后,我打印在文件中找到的单词数量以及添加到树中的单词数量(我不添加已经存在的单词)。现在我想将树导出到一个文件,所以我需要打开一个可以写入的文件。由于我使用只读方式对 open_file 进行了硬编码,因此我为方式添加了一个参数。但是当我现在运行程序时,它没有给出错误(所以文件指针不是 NULL),只是说在文件中找到了 0 个单词并添加了 0 个单词。我打印的文件也是空的。希望这能让它更清楚一点
【问题讨论】:
-
始终启用推荐的编译器警告。作为初学者,让他们犯错误。
-
UB,如果启用了警告,任何编译器都会诊断出来。关闭投票。由于有相关信息,因此撤回了投票
-
@AnttiHaapala 正如 OP 可能不知道的那样:UB 代表 未定义的行为,即当你做你不允许做的事情时。在这种情况下,行为是不确定的,一切都可能发生,包括从你的鼻子飞出的小精灵!
-
确保在使用完文件后也关闭它们
-
尝试在函数内部打印文件名和模式。也许您的 args 结构有问题。您如何初始化 args 中的字符串?如果您仅在 main 以外的函数中进行赋值,则内存可能会在函数调用结束时被释放。这是一个问题。再一次,字符串通常以常量内存的形式存储,除非您像
char string[] = "hello";那样初始化它们