2012-02-07 45 views
1

如何獲取文件,將其複製並附加到不同文件的末尾?複製文件並追加到另一個文件

我想複製的文件是否需要打開一個閱讀,直到EOF或者是否可以複製並添加?

+1

你需要標準輸入輸出陸續讀一個「字節」並複製到文件結束。 – Vyktor 2012-02-07 19:28:40

+1

逐字節讀取文件聽起來並不是一個好主意。最好爲數據分配一個更大的緩衝區,例如16KB。 – 2012-02-07 19:37:49

+1

自從您爲此標記爲「c」後,我不會將其作爲答案發布,但在linux上:cat file1 >> file2'。 Cat將文件名作爲參數並將每個文件名轉儲到stdout。 '>>'操作就像'>'用於重定向stdout,只不過它以附加模式打開目標文件。編輯:或者,'cat file1 file2> file3'可用於連接兩個文件並將其輸出指向第三個文件。 – 2012-02-07 22:28:05

回答

0

除了cnicutar的答案,我會說:

  • 打開該文件,你需要在「追加」模式追加(「A」參數fopen()函數)。

  • 打開需要在「讀取」模式('r'參數爲fopen())中追加的文件。

5

您的問題對我來說不是100%清楚,但這是您如何將文件追加到另一個文件。 我只使用了一個1字節的緩衝區。您也可以以塊的形式複製文件。

FILE *source = fopen("to_copy", "rb"); 
/* I'm assuming it opened OK */ 
FILE *dest = fopen("dest", "ab"); 
/* I'm assuming it opened OK, again */ 

char byte; 

while (!feof(source)) 
{ 
    fread(&byte, sizeof(char), 1, source); 
    fwrite(&byte, sizeof(char), 1, dest); 
} 

fclose(source); 
fclose(dest); 
+2

爲什麼你們這麼喜歡1字節的緩衝區?與使用1字節緩衝區發佈實際的'read' /'write'系統調用無關,因爲C庫實現很可能有一些內部緩衝,但仍然如此。 – 2012-02-07 19:41:04

+0

正如我所說,這僅僅是一個例子。他可以找到最適合他的緩衝區大小。 – 2012-02-07 19:43:03

+0

另外,在這段代碼的情況下,'feof','fread'和'fwrite'都將爲文件的每個字節執行。當文件具有相當大的尺寸時,開銷肯定很重要。 – 2012-02-07 19:44:36

0

當您在追加方式打開一個文件,文件指針默認是在現有文本的末尾。所以當你寫入這個文件時,新的內容將被「附加」到文本中。

+0

這不是我所要求的,但謝謝。我的意思是如何複製文件數據並將其附加到另一個文件,而無需讀取我想按塊複製塊的整個文件。 – jarryd 2012-02-07 21:44:10

4

要文件tail的內容複製到文件head結束時,對於(文本或二進制)讀取和head可以進行追加開tail;像這樣(Plan 9的cat.c模仿。):

#include <stdio.h> 
#include <stdlib.h> 

void 
append(FILE *head, FILE *tail) 
{ 
    char buf[BUFSIZ]; 
    size_t n; 
    while ((n = fread(buf, 1, sizeof buf, tail)) > 0) 
     if (fwrite(buf, 1, n, head) != n) 
      abort(); 
    if (ferror(tail)) 
     abort(); 
} 

int main(void) 
{ 
    FILE *head = fopen("head", "ab"); 
    FILE *tail = fopen("tail", "rb"); 
    if (!head || !tail) 
     abort(); 
    append(head, tail); 

    fclose(head); 
    fclose(tail); 

    exit(EXIT_SUCCESS); 
} 

正確的錯誤報告已作爲練習留給讀者。

相關問題