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

myd*_*dsl 5 c posix file filestream

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

例如

FILE A            File B should be
|---------|        |----------|
|ABCDEF   |        |FEDCBA    |
|---------|        |----------|
Run Code Online (Sandbox Code Playgroud)

*********************更新**********

感谢MikeNakis的提示和建议,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;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*kis 5

你只是寻求结束并从那里开始阅读.难怪它不会读任何东西.你需要寻找到最后减去1个字节,读取一个字节,写入它,然后寻找到最后减去两个字节,读取另一个字节,依此类推.

我认为这是一项家庭作业,所以你的教授不应该介意这种方法的极端低效率.(真实世界的性能问题是非 - 非学术性的.)如果他抱怨,告诉他理论上,它具有与执行相同任务的任何其他算法相同的时间复杂度:O(N).(那个发音为"en的大哦".)他会给你一个A +.

  • @BasileStarynkevitch让他让它以正确的方式正常工作,然后他可能会担心提高效率."过早优化是所有邪恶的根源". (2认同)