【问题标题】:Does fwrite() overwrite when called multiple times?fwrite() 是否会在多次调用时覆盖?
【发布时间】:2020-06-07 16:56:10
【问题描述】:

示例:我正在遍历一棵树并基于前序遍历进行写作。

这是伪代码:

void func x ('','')
{
  do something 
  helper (char * filename, thing to be written);
}

void helper (char * filename, thing to be written)
{
  FILE * fp = fopen (filename,"w");
  fwrite(, , ,fp);
  fclose(fp);
  return 0;
}

它会覆盖以前的条目吗?如果是这样,我该如何防止这种情况?有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果您不希望它被覆盖,那么要么只打开文件一次,然后对每个函数调用使用相同的fp,或者使用fopen 和"a+" 进行文件追加。有关详细信息,请参阅fopen man page。
  • @kaylum 谢谢。那么我可以将fp 作为参数传递给辅助函数吗?
  • @fresh42juice — 是的,将打开的文件指针传递给helper()。不要关闭helper()中的文件指针。

标签: c file helper fwrite


【解决方案1】:

正如 kaylum 所说,简短的回答是肯定的。

带有“w”的fopen 将在开头打开文件,因此任何写入都将截断并覆盖。为了避免这种情况,要么重用每次 fopen 返回的文件指针,要么使用 "a" 将 fwrite 设置为追加模式。

【讨论】:

  • 我已经问过了,但是 - 在那种情况下,我可以将 fp 作为参数传递给辅助函数吗?谢谢。
  • 由于我在做前序遍历递归会涉及到,如何避免多次打开文件?我有点困惑。
  • @fresh42juice:在调用inorder_traversal()之前,打开文件流:FILE *fp = fopen(filename, "a");。致电inoder_traversal(root, fp);。当它返回时,fclose(fp);。不要忘记检查文件是否已成功打开。
  • 我应该添加:在inorder_traversal() 中,将文件指针传递给它调用的相关函数。如有必要,修改函数以使用文件指针而不是文件名。
  • @JonathanLeffler 我想我明白了,谢谢。所以基本上在我开始我的树遍历之前我打开文件流。并传递给我的遍历函数——这个函数又调用一个帮助器,它会写入文件。我也会将我的fp 传递给这个助手。我理解正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多