lseek()用于复制文件

时间:2012-12-03 13:44:48

标签: c file

我做了什么:以相反的顺序复制文件的内容。 我无法做到的事情:向前复制内容。

我在网上进行了研究,发现lseek()有这个论点..

lseek(file_descriptor,offset,whence);

反向读取逻辑是直截了当的。我的代码如下:

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

void main(int argc,char *argv[])
{
    int fd,fd1,count=0;
    char ch='y',buffer;
    if(argc>3)
    {   
        printf("\nSyntax Error!<try> ./cp source_name destination_name\n");
        exit(0);
    }

    fd=open(argv[1],O_RDWR);
    if(fd==-1)
    {
        printf("\nCan not open source file .. :(\n");exit(0);
    }

    fd1=open(argv[2],O_RDWR);

    if(fd1=!-1)
    {
         printf("\nDestination file exist , OverWrite (Y/N) :");
         scanf("%s",&ch);
    }

    if(ch=='y'||ch=='Y')
        fd1=creat(argv[2],O_RDWR|0666);
    else
        exit(0);

    while(lseek(fd,count,2)!=-1)
    {
        count--;
        read(fd,&buffer,sizeof(char));
        write(fd1,&buffer,sizeof(char));
    }
}   

我认为可以通过向前复制文件来进行哪些更改。

count=0;

lseek(fd,count,0)!=-1


but this is taking the program in infinite loop . need help .

2 个答案:

答案 0 :(得分:1)

要向前复制,您不需要lseek

您只需复制,直到read返回零:

while(read(fd,&buffer,sizeof(char)) > 0)
{
    write(fd1,&buffer,sizeof(char));
}

当然,要有效地执行此操作,您将使用大于一个字符的缓冲区,但是如果最后write小于缓冲区,则必须小心read的数据量。

答案 1 :(得分:0)

您的向后副本依赖于count变为否定并寻求失败。 这不适用于正偏移,因为lseek(2)允许将偏移量设置为超出文件末尾,请参见手册页。