2012-02-07 211 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); 
} 

正确的错误报告已作为练习留给读者。

相关问题