6

我想定义两个函数 fdump 和 sdump,在每种情况下使用 fprintf 和 sprintf 将结构转储到文件或缓冲区。

有没有办法在不重复两个函数中的代码的情况下定义它们?一种解决方案可以是定义 sdump,然后基于它定义 fdump,ei:

void fdump(FILE* f, struct mystruct* param) {
  char buffer[MAX];
  sdump(buffer, MAX, param);
  fprint(f, "%s", buffer);
}

但该解决方案浪费和中间缓冲。尽管 fprintf 可能也是如此。其他解决方案可能是通过预处理宏,但它看起来相当复杂。请问,有什么想法吗?

提前致谢

4

1 回答 1

3

您可以使用fmemopen为您提供指向一块内存的文件句柄,然后只编写一个采用文件句柄的函数版本:

#include <stdio.h>

void foo(FILE *fh) {
  fprintf(fh, "test\n");
}

int main() {
  foo(stderr);
  char str[100];
  FILE *mem = fmemopen(str, sizeof str, "w");
  foo(mem);
  fclose(mem);
  fprintf(stdout, "%s", str);
  return 0;
}
于 2012-07-30T15:29:05.387 回答