![](/img/trans.png)
[英]How to concatenate two pointers to string and store it in an array or characters?
[英]Concatenate two file pointers
我正在尋找一個函數FILE * join (FILE * a, FILE * b)
等效於popen("cat ab", "r");
。 也就是說,調用join
應該產生一個新的文件指針,該指針包含所有文件a
,然后包含所有文件b
。
最好join
應該是惰性的,以便直到所有文件a
被消耗完才讀取文件b
。
您不能為此創建可移植函數。 可以在Linux / Glibc上使用fopencookie
或在BSD上使用funopen
。 請參閱: 是否可以使用對自定義結構的FILE *起作用的函數? 但是我不知道在Windows上有任何方法。
您只需要提供一種讀取方法,就可以嘗試從第一個文件句柄中讀取給定數量的字節,到目前為止,該句柄還沒有文件結束條件。
我不認為您可以:至少在不創建臨時文件並將結果包裝在FILE*
,該FILE*
使您可以使用fread()
等“常規”文件訪問功能。
其中的邏輯是很容易的:讀取a
文件結束之前的-,然后讀取b
但你不能“進去”的FILE*
處理例程(至少在一個可移植的方式,根據安蒂的答案 ),讓他們做從一個文件切換到另一個文件。
您可以編寫一個函數來替換采用兩個FILE*
參數的特定文件處理函數,例如,您可以定義接受兩個流的fread2(void *ptr, size_t size, size_t nmemb, FILE *stream1, FILE* stream2)
,從其中一個讀取,直到用盡為止,然后切換到另一個。
或者,您可以創建自己的FILEPAIR
結構(由join()
返回/填充),該結構保留對兩個FILE*
的引用,然后創建對該結構進行操作的專用讀取函數(例如fread2(void *ptr, size_t size, size_t nmemb, FILEPAIR *filePair)
。
這是我的加入函數,有關兼容性問題,請參閱Antti Haapala的答案 。
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 });
}
由於這已經是特定於Linux的,因此我們還可以定義一個函數:
FILE * empty () {
return fopen("/dev/null", "r");
}
現在,文件指針在join
和empty
下形成一個monoid!
沒有這種功能。 您需要使用它來編寫自己的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.