【问题标题】:c copy files in reverse order using lseekc 使用 lseek 以相反的顺序复制文件
【发布时间】:2012-01-03 17:22:02
【问题描述】:

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

例如

FILE A            File B should be
|---------|        |----------|
|ABCDEF   |        |FEDCBA    |
|---------|        |----------|

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

感谢 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;
}

【问题讨论】:

  • “逆序”是什么意思?
  • 像文件A一样从末尾复制文件|abcdefg|文件 B 应该被复制 |gfedcba|
  • OK - 所以你想颠倒目标文件中 bytes 的顺序?
  • 你的意思是,字符串反转整个文件内容并写入一个新文件?!
  • Paul R. 是的,我想你抓住了我)

标签: c file posix filestream


【解决方案1】:

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

我认为这是一项家庭作业,因此您的教授不应该介意这种方法的效率极低。 (现实世界的性能问题太不学术了。)如果他抱怨,告诉他理论上,它与执行相同任务的任何其他算法具有相同的时间复杂度:O(N)。 (读作“big oh of en”。)他会给你一个 A+。

【讨论】:

  • 那么你应该关心缓冲。为什么不一次处理几个千字节的文件?
  • lseek(source,-1,SEEK_END) 方向正确,但这也行不通。您应该在 for 循环中使用 lseek(source,n,SEEK_END),其中 n 从 -1 开始变化,而
  • @BasileStarynkevitch 让他让它像糖蜜一样缓慢地正常工作,然后他可能会担心让它更有效率。 “过早的优化是万恶之源”。
  • 你把读取位置放在需要的位置,读取一个字节,然后写入输出文件,然后将读取位置移回 1,然后重复。直到源文件的开头。
  • for(int i = 0; i
【解决方案2】:

lseek(source, (off_t) i, SEEK_SET);应该是 lseek(source, (off_t) i - 1, SEEK_SET);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多