从Linux C程序中的资源文件追加到现有文件

时间:2012-12-07 19:27:07

标签: c linux append mode

我尝试使用Linux中的C编程从资源文件执行附加到现有文件。但是,我的代码不起作用,任何人都可以告诉我代码有什么问题,以及O_APPEND是如何工作的?谢谢:))

char ifile[150];
char tfile[150];
char cc;

system("clear");
printf("Please enter your resource file name : ");
gets(ifile);
printf("Please enter your destination file name : ");
gets(tfile);

int in, out;

in = open(ifile, O_RDONLY);
int size = lseek(in,0L,SEEK_END);
out = open(tfile, O_WRONLY |O_APPEND);
char block[size];
int pdf;
while(read(in,&block,size) == size)
    pdf = write(out,&block,size);
close(in);close(out);
if(pdf != -1)
    printf("Successfully copy!");
else
    perror("Failed to append! Error : ");
printf("Press enter to exit...");
do
{
    cc = getchar();
} while(cc != '\n');

1 个答案:

答案 0 :(得分:1)

这里的问题是您将文件末尾的读取光标移除以便知道其大小,但是您不能回退到文件的开头以便能够读取。因此read()会读取EOF,并返回0

int size = lseek(in, 0L, SEEK_END);
out = open(tfile, O_WRONLY | O_APPEND);

应该是

int size = lseek(in, 0L, SEEK_END);
lseek(in, 0L, SEEK_SET);
out = open(tfile, O_WRONLY | O_APPEND);

此外,当您读写时,您应该使用block而不是&block,因为block已经是指针(或地址)。

哦,还有......打开文件out进行写入...如果文件不存在,则会失败。

此处如何创建权限设置为644:

out = open(tfile, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

(如果文件已经存在,这将不起作用)