【问题标题】:How to create and open a file in C and make it avaliable to the entire program?如何在 C 中创建和打开一个文件并使其可供整个程序使用?
【发布时间】:2015-08-21 06:36:19
【问题描述】:

我想为一个程序创建一个日志文件,为此我想创建并打开一个.txt 文件,并使其可供整个程序写入。

例如,我有一个全局文件指针fp,它已在文件“debug.c”中创建。现在我使用一个函数打开了文件:

void initlog()
   {
      fp = fopen("filename.txt","w");
   }

如果我使用上述函数打开文件是否可以在程序的其他部分写入/附加到同一个文件?

我可以将fp使用extern关键字分享给其他文件吗,这样可以在其他文件中获取打开的文件指针(fp)吗?

编辑

不能使用线程,因为它是一个单线程程序

【问题讨论】:

  • 如果你不使用线程,我认为这没有问题。
  • 是的。但可以说最好不要那样做。而是实现一个日志工具,它导出 API 以写入日志。然后程序的其他部分将调用 API,而不是直接写入文件。
  • @AlanAu 日志记录工具是什么意思?如果我想写入日志,那么我还需要一个打开的文件指针,所以我必须经常打开和关闭文件,为了避免我第一次打开文件并使打开的文件指针全局,那么我可以在需要时写入文件并在日志末尾关闭文件吗?这样可以避免频繁打开和关闭文件..
  • 不,你不需要把 fp 给每个人。在 debug.c 中实现 initlog 和一个附加的 wrtitelog 函数。只有那些功能需要 fp。其他地方只需调用writelog。这只是一个简单的例子。一个真正的日志记录工具会做更多的事情(例如不同级别的日志记录)。这只是标准的模块化设计。因此,如果您想稍后更改日志记录(例如改为写入控制台),则只需更改内部日志记录实现。

标签: c file


【解决方案1】:

你可以试试这个。

freopen("file.txt","w",stdout);

这会让你的 printf 写入文件。

要追加使用“a”而不是“w”。

【讨论】:

    【解决方案2】:

    您可以在调用中封装日志记录,而不是使用全局文件指针

    例如

    void Log(const char* frmt, ... )
    {
      FILE* fp = fopen("yourlog.txt","ab" );
      if (fp != NULL)
      {
       va_list args;
       va_start(args, frmt);
       vfprintf(fp, frmt, args);
       va_end(args);
       fclose(fp);
      } 
    }
    

    优点是即使你的程序崩溃,它也会被刷新到磁盘中。您还可以决定输出的特殊格式,例如添加时间戳等

    它可能会导致大量文件 I/O 或性能损失的缺点,取决于您的用例

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多