Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印到缓冲区或文件重用代码_C - Fatal编程技术网

C 打印到缓冲区或文件重用代码

C 打印到缓冲区或文件重用代码,c,C,我想定义两个函数fdump和sdump,分别使用fprintf和sprintf将结构转储到文件或缓冲区 有没有一种方法可以在不重复两个函数中的代码的情况下定义它们? 一种解决方案可以是定义sdump,然后在此基础上定义fdump,即: void fdump(FILE* f, struct mystruct* param) { char buffer[MAX]; sdump(buffer, MAX, param); fprint(f, "%s", buffer); } 但这种溶液会浪

我想定义两个函数fdump和sdump,分别使用fprintf和sprintf将结构转储到文件或缓冲区

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

void fdump(FILE* f, struct mystruct* param) {
  char buffer[MAX];
  sdump(buffer, MAX, param);
  fprint(f, "%s", buffer);
}
但这种溶液会浪费时间和中间缓冲液。虽然fprintf可能也会这样做。另一种解决方案是通过预处理宏,但它看起来相当复杂。拜托,有什么想法吗


提前感谢

您可以使用
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;
}
#包括
无效foo(文件*fh){
fprintf(fh,“测试”);
}
int main(){
foo(stderr);
char-str[100];
文件*mem=fmemopen(str,sizeof str,“w”);
foo(mem);
fclose(mem);
fprintf(stdout,“%s”,str);
返回0;
}

它还没有写出来。但它只会将结构字段的名称及其值打印到缓冲区。