Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c使用lseek以相反顺序复制文件_C_File_Posix_Filestream - Fatal编程技术网

c使用lseek以相反顺序复制文件

c使用lseek以相反顺序复制文件,c,file,posix,filestream,C,File,Posix,Filestream,我已经知道如何从一开始就将一个文件复制到另一个文件,但我如何修改程序以按相反顺序复制它呢?源文件应具有读访问权限,目标文件应具有读写执行权限。我必须使用文件控制库 比如说 FILE A File B should be |---------| |----------| |ABCDEF | |FEDCBA | |---------| |----------| *****************更新*************

我已经知道如何从一开始就将一个文件复制到另一个文件,但我如何修改程序以按相反顺序复制它呢?源文件应具有读访问权限,目标文件应具有读写执行权限。我必须使用文件控制库

比如说

FILE A            File B should be
|---------|        |----------|
|ABCDEF   |        |FEDCBA    |
|---------|        |----------|
*****************更新**************

谢谢你的提示和建议 ,Sangeeth获取您的代码

我已经修改了代码,现在它是以相反的顺序复制字节打印文件大小

这是密码

#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>
#include<unistd.h>

int main(int argc, char *argv[]) {

    int source, dest, n;
    char buf;
    int filesize;
    int i;

    if (argc != 3) {
        fprintf(stderr, "usage %s <source> <dest>", argv[0]);
        exit(-1);
    }

    if ((source = open(argv[1], 0400)) < 0) { //read permission for user on source
        fprintf(stderr, "can't open source");
        exit(-1);
    }

    if ((dest = creat(argv[2], 0700)) < 0) { //rwx permission for user on dest
        fprintf(stderr, "can't create dest");
        exit(-1);
    }

    filesize = lseek(source, (off_t) 0, SEEK_END); //filesize is lastby +offset
    printf("Source file size is %d\n", filesize);

    for (i = filesize - 1; i >= 0; i--) { //read byte by byte from end
        lseek(source, (off_t) i, SEEK_SET);

        n = read(source, &buf, 1);

        if (n != 1) {
            fprintf(stderr, "can't read 1 byte");
            exit(-1);
        }

        n = write(dest, &buf, 1);
        if (n != 1) {
            fprintf(stderr, "can't write 1 byte");
            exit(-1);
        }

    }
    write(STDOUT_FILENO, "DONE\n", 5);
    close(source);
    close(dest);



    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int源,dest,n;
焦炉;
int文件大小;
int i;
如果(argc!=3){
fprintf(标准,“使用率%s”,argv[0]);
出口(-1);
}
如果((source=open(argv[1],0400))<0){//source上用户的读取权限
fprintf(stderr,“不能开源”);
出口(-1);
}
如果((dest=creat(argv[2],0700))<0){//rwx对dest上用户的权限
fprintf(stderr,“无法创建dest”);
出口(-1);
}
filesize=lseek(source,(off_t)0,SEEK_END);//filesize是lastby+offset
printf(“源文件大小为%d\n”,文件大小);
对于(i=filesize-1;i>=0;i--){//从末尾逐字节读取
lseek(源,(关)i,搜索集);
n=读取(源和buf,1);
如果(n!=1){
fprintf(stderr,“无法读取1字节”);
出口(-1);
}
n=写入(dest和buf,1);
如果(n!=1){
fprintf(stderr,“不能写入1字节”);
出口(-1);
}
}
写入(标准输出文件号,“完成”,5);
关闭(源);
关闭(dest);
返回0;
}

你只需寻找到底,然后从那里开始阅读。难怪它什么也看不到。您需要查找到负1字节的结尾,读取一个字节,写入它,然后查找到负2字节的结尾,读取另一个字节,依此类推


我想这是一个家庭作业,所以你的教授不应该介意这种方法的极端低效。(现实世界中的性能问题非常不学术。)如果他抱怨,告诉他理论上,它的时间复杂度与执行相同任务的任何其他算法相同:O(N)。(发音为“big oh of en”。)他会给你一个A+。

lseek(source,(off)i,SEEK\u SET);可能应该是lseek(源,(关)i-1,搜索集)

“按相反顺序”是什么意思?从末尾复制文件,如文件A | abcdefg |应复制文件B | gfedcba |好-那么您想反转目标文件中字节的顺序吗?您的意思是,字符串反转整个文件内容并将其写入新文件?!保罗R。是的,我想你明白了)那么你应该关心缓冲。为什么不一次处理几千字节的文件呢?lseek(source,-1,SEEK\u END)的方向是正确的,但这也不起作用。您应该在for循环中使用lseek(source,n,SEEK_END),其中n从-1开始变化,而@BasileStarynkevitch让它以像糖蜜一样慢的方式正确工作,然后他可能会担心如何提高效率。“过早优化是万恶之源”。将读取位置放在需要的位置,读取一个字节,并将其写入输出文件,然后将读取位置向后移动1,然后重复。直到源文件的开头。对于(inti=0;i