c копировать файлы в обратном порядке, используя lseek
У меня есть как скопировать один файл в другой с самого начала, но как я могу изменить программу, чтобы скопировать ее в обратном порядке? Исходный файл должен иметь права на чтение, а целевой файл - чтение и запись. Я должен использовать библиотеки управления файлами.
например
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;
}
2 ответа
Вы просто стремитесь к концу и начинаете читать оттуда. Не удивительно, что это ничего не прочитает. Вам нужно искать до конца минус 1 байт, читать один байт, записывать его, затем искать до конца минус два байта, читать другой байт и так далее.
Я предполагаю, что это домашнее задание, поэтому ваш профессор не должен обращать внимания на крайнюю неэффективность этого подхода. (Реальные проблемы с производительностью очень не академичны.) Если он жалуется, скажите ему, что теоретически он имеет такую же сложность по времени, как и любой другой алгоритм, который будет выполнять ту же задачу: O(N). (Это произносится как "большой ой эн".) Он даст вам +.
lseek(source, (off_t) i, SEEK_SET); вероятно, должно быть lseek(source, (off_t) i - 1, SEEK_SET);