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
。链接在磁盘上创建一个物理文件,这不是我要找的。这看起来正是我要找的。这看起来正是我要找的