c copier les fichiers dans l'ordre inverse à l'aide de lseek
J'ai comment faire pour copier un fichier à l'autre depuis le début, mais comment pourrais-je modifier le programme pour le copier dans l'ordre inverse? Fichier Source doit avoir un accès en lecture et du fichier de destination lire écrire exécuter. Je dois utiliser des fichiers de bibliothèques de contrôle.
par exemple
FILE A File B should be
|---------| |----------|
|ABCDEF | |FEDCBA |
|---------| |----------|
*********************Mise à JOUR**********
Merci, MikeNakis pour les conseils et les suggestions
,Sangeeth pour votre code
J'ai retravaillé le code et maintenant, c'est de copier les octets dans l'ordre inverse de l'impression de la taille du fichier
voici le code
#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;
}
Qu'entendez-vous par "dans l'ordre inverse" ?
copier le fichier à partir de la fin de fichier A |abcdefg| fichier B doit être copié |gfedcba|
OK - donc, vous voulez inverser l'ordre de la octets dans le fichier de destination ?
voulez-vous dire, la chaîne d'inverser l'ensemble du contenu d'un fichier et écrire dans un nouveau fichier?!
Paul R. Oui, je pense que vous m')
copier le fichier à partir de la fin de fichier A |abcdefg| fichier B doit être copié |gfedcba|
OK - donc, vous voulez inverser l'ordre de la octets dans le fichier de destination ?
voulez-vous dire, la chaîne d'inverser l'ensemble du contenu d'un fichier et écrire dans un nouveau fichier?!
Paul R. Oui, je pense que vous m')
OriginalL'auteur mydreamadsl | 2012-01-03
Vous devez vous connecter pour publier un commentaire.
Vous cherchez simplement à la fin et commencer la lecture à partir de là. Pas étonnant qu'il ne sera pas lire quoi que ce soit. Vous avez besoin de chercher à la fin moins 1 octet, lire un octet, de l'écrire, puis chercher à la fin moins deux octets, lire un autre octet, et ainsi de suite.
Je présume que c'est un devoir à la maison, de sorte que votre professeur ne doit pas tenu de l'extrême inefficacité de cette approche. (Dans le monde réel soucis de performance sont oh-so onu-académique.) S'il se plaint, lui dire qu'en théorie, c'est la complexité en même temps que tout autre algorithme qui permettrait d'effectuer la même tâche: O(N). (Qui se prononce "big oh de fr".) Il vous donne Un a+.
lseek(source,-1,SEEK_END) est dans la bonne direction, mais qui ne fonctionnera pas, soit. Vous devez utiliser lseek(source,n,SEEK_END), à l'intérieur d'une boucle for, où n varie de départ de -1, alors que <= -taille_fichier.
permettez-lui de le faire fonctionner correctement la lente comme de la mélasse, et puis il inquiétez peut-être de le rendre plus efficace. "L'optimisation prématurée est la racine de tout mal".
Vous mettez la lecture de la position où elle doit être, lire un octet, et l'écrire dans le fichier de sortie, puis déplacer la position de lecture au dos par 1, et répétez. Jusqu'au début du fichier source.
for( int i = 0; i < taille_fichier; i++ ) { lseek(source,taille_fichier - 1 - i,SEEK_END); ... }
OriginalL'auteur Mike Nakis
lseek(source, (off_t) i, SEEK_SET); devrait probablement être lseek(source, (off_t) i - 1, SEEK_SET);
OriginalL'auteur Anthony Brown