簡體   English   中英

連接兩個文件指針

[英]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");
}

現在,文件指針在joinempty下形成一個monoid!

沒有這種功能。 您需要使用它來編寫自己的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM