【问题标题】:C open file using a function [closed]C使用函数打开文件[关闭]
【发布时间】: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"; 那样初始化它们

标签: c function file


【解决方案1】:
FILE *open_file(char* filename, char* mode)
{
    FILE *f;
    f = fopen(filename, mode);
    if(!f)
    {
        perror(filename)
        exit(EXIT_FAILLURE);
    }
}

您的函数不返回任何内容。只需在末尾添加return f;。似乎你的包装器做的工作很少,也可以把这段代码放在你直接使用它的地方,而不是有这个函数。

【讨论】:

  • 我确实返回了 f,我忘记将它添加到代码 sn-p 中。感谢您的关注
  • 我想我不会。我关闭在程序结束时打开的第一个文件。不能同时打开多个文件吗?
  • @Danagon 是的,您可以同时打开多个不同的文件;还要检查errno 如果 fopen 无法获得线索 fopen 有什么问题
  • @GiorgiMoniava perror 以明文形式打印errno 后面的错误,肯定不会被忽视
  • @AnttiHaapala 哎呀没看到。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 2010-12-18
  • 2010-10-05
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多