C 连接两个文件指针

C 连接两个文件指针,c,file,C,File,我正在寻找一个函数FILE*join(FILE*a,FILE*b),它相当于popen(“catab”,“r”)。也就是说,调用join应该生成一个新的文件指针,该指针包含所有文件a,然后是所有文件b 最好是join应该是惰性的,这样文件b在所有文件a被消耗之前不会被读取。没有这样的功能。你需要它来自己写。没有这样的功能。您需要自己编写。您无法为此创建可移植函数。可以在Linux/Glibc上使用fopencookie,也可以在BSD上使用funopen。请看:我不知道在Windows上有什么方

我正在寻找一个函数
FILE*join(FILE*a,FILE*b)
,它相当于
popen(“catab”,“r”)。也就是说,调用
join
应该生成一个新的文件指针,该指针包含所有文件
a
,然后是所有文件
b


最好是
join
应该是惰性的,这样文件
b
在所有文件
a
被消耗之前不会被读取。

没有这样的功能。你需要它来自己写。

没有这样的功能。您需要自己编写。

您无法为此创建可移植函数。可以在Linux/Glibc上使用
fopencookie
,也可以在BSD上使用
funopen
。请看:我不知道在Windows上有什么方法可以实现这一点


您只需要提供一种读取方法,该方法将尝试从第一个文件句柄中读取给定数量的字节,到目前为止,该句柄没有文件结束条件。

您无法为此创建一个可移植函数。可以在Linux/Glibc上使用
fopencookie
,也可以在BSD上使用
funopen
。请看:我不知道在Windows上有什么方法可以实现这一点


您只需要提供一种读取方法,该方法将尝试从第一个文件句柄读取给定数量的字节,到目前为止,该句柄没有文件结束条件。

我不认为您可以:至少在不创建临时文件并将结果包装成允许您使用“正常”的
文件*
的情况下文件访问功能,如
fread()

逻辑很简单:从
a
读取文件,直到文件结束,然后从
b
读取,但您不能“进入”
文件*
处理例程(至少以便携方式,根据)让它们从一个文件切换到另一个文件

您可以编写一个函数来替换使用两个
file*
参数的特定文件处理函数,例如,您可以定义接受两个流的
fread2(void*ptr、size\t size、size\t nmemb、file*stream1、file*stream2)
,从一个流读取,直到耗尽为止,然后切换到另一个流


或者您可以创建自己的
FILEPAIR
结构(由
join()
返回/填写),其中包含对两个
文件*
的引用,然后创建在该结构上运行的专用读取函数(例如
fread2(void*ptr,size\t size,size\t nmemb,FILEPAIR*FILEPAIR)

我不认为您可以:至少在不创建临时文件并将结果包装成
文件*
的情况下,您可以使用“正常”文件访问功能,如
fread()

逻辑很简单:从
a
读取文件,直到文件结束,然后从
b
读取,但您不能“进入”
文件*
处理例程(至少以便携方式,根据)让它们从一个文件切换到另一个文件

您可以编写一个函数来替换使用两个
file*
参数的特定文件处理函数,例如,您可以定义接受两个流的
fread2(void*ptr、size\t size、size\t nmemb、file*stream1、file*stream2)
,从一个流读取,直到耗尽为止,然后切换到另一个流


或者您可以创建自己的
FILEPAIR
结构(由
join()
返回/填写),其中包含对两个
文件*
的引用,然后创建在该结构上运行的专用读取函数(例如
fread2(void*ptr,size\t size,size\t nmemb,FILEPAIR*FILEPAIR)

这是我的加入功能,有关兼容性问题,请参阅

typedef struct {
  FILE * a;
  FILE * b;
} myCookie;

ssize_t join_read(myCookie * cookie, char *buf, size_t size) {
  size_t s = fread(buf, 1, size, cookie->a);

  if (s < size)
    s += fread(buf+s, 1, size-s, cookie->b);

  return s;
}

int join_close(myCookie * cookie) {
  return fclose(cookie->a) | fclose(cookie->b);
}

FILE * join (FILE * a, FILE * b) {
  myCookie * cookie = malloc(sizeof(myCookie));
  cookie->a = a;
  cookie->b = b;
  return fopencookie(cookie, "r", (cookie_io_functions_t)
      { join_read
      , NULL
      , NULL
      , join_close });
}

现在,文件指针在
join
empty

下面是我的join函数,有关兼容性问题,请参阅

typedef struct {
  FILE * a;
  FILE * b;
} myCookie;

ssize_t join_read(myCookie * cookie, char *buf, size_t size) {
  size_t s = fread(buf, 1, size, cookie->a);

  if (s < size)
    s += fread(buf+s, 1, size-s, cookie->b);

  return s;
}

int join_close(myCookie * cookie) {
  return fclose(cookie->a) | fclose(cookie->b);
}

FILE * join (FILE * a, FILE * b) {
  myCookie * cookie = malloc(sizeof(myCookie));
  cookie->a = a;
  cookie->b = b;
  return fopencookie(cookie, "r", (cookie_io_functions_t)
      { join_read
      , NULL
      , NULL
      , join_close });
}

现在,文件指针在
join
empty

下形成一个幺半群。您使用的术语错误。您需要一个函数来创建一个新文件,该文件是两个其他文件的串联。显然,您至少缺少所需的名称作为参数。我不希望在磁盘上创建物理文件,但在磁盘上创建一个虚拟文件他和波本一样定义“虚拟”file please?
popen
正在创建一个指向已创建进程的管道。您使用的术语错误。您需要一个函数来创建一个新文件,该文件是两个其他文件的串联。显然,您至少缺少所需的参数名称。我不想在磁盘上创建物理文件,但以相同的方式创建虚拟文件hat popen所做的。定义“虚拟”file please?
popen
正在创建一个指向已创建进程的管道。我是一个完全的C初学者。您能否详细说明我如何创建
join
?@BlackCap试试。这将创建第三个文件。您可能不需要这个,然后您可以在循环中读取文件,首先是文件
a
,然后是文件
b
。链接创建一个物理层磁盘上的sical文件,这不是我想要的。我是一个完全的C初学者。你能详细说明我如何创建
join
?@BlackCap尝试一下。这将创建第三个文件。你可能不想要这个,然后你可以在循环中读取文件,首先是文件
a
,然后是文件
b
。链接在磁盘上创建一个物理文件,这不是我要找的。这看起来正是我要找的。这看起来正是我要找的