c копировать файлы в обратном порядке, используя lseek - PullRequest
5 голосов
/ 03 января 2012

У меня есть способ скопировать один файл в другой с самого начала, но как я могу изменить программу, чтобы копировать ее в обратном порядке?Исходный файл должен иметь права на чтение, а целевой файл - чтение и запись.Я должен использовать библиотеки управления файлами.

например

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

********************* UPDATE **********

Спасибо, 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;
}

Ответы [ 2 ]

5 голосов
/ 03 января 2012

Вы просто стремитесь к концу и начинаете читать оттуда.Не удивительно, что это ничего не прочитает.Вам нужно искать до конца минус 1 байт, читать один байт, записывать его, затем искать до конца минус два байта, читать другой байт и т. Д.Ваш профессор не должен обращать внимания на крайнюю неэффективность этого подхода.(Реальные проблемы с производительностью очень не академичны.) Если он жалуется, скажите ему, что теоретически он имеет такую ​​же сложность по времени, как и любой другой алгоритм, который выполняет ту же задачу: O (N).(Это произносится как «большой ой эн».) Он даст вам +.

0 голосов
/ 22 июля 2013

lseek (источник, (off_t) i, SEEK_SET);должно быть lseek (source, (off_t) i - 1, SEEK_SET);

...