/* Programme mettant les lignes du fichier toto.txt Sens Dessus Dessous (SDD). * Dans le fichier résultat (totoSdd.txt, la 1ère ligne de toto.txt se * retrouve en dernier, la 2ème ligne en avant-dernière position... * Dans cette version, le programme suppose que toto.txt est constitué d'un * nombre variable de lignes de 8 caractères (NB : le 8ème caractère de chaque * ligne est le '\n'). */ #include #include #include #include #include #include #define NBCAR 8 typedef char ligne_t[NBCAR]; int main() { int source, dest; ligne_t ligne; int i; struct stat sts; int nbLigne; source = open("./toto.txt", O_RDONLY); if (source < 0) { perror("open toto.txt"); exit(1); } dest = open("./totoSdd.txt", O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); if (dest < 0) { perror("open toto.txt"); exit(1); } /* Calcul du nombre de lignes en récupérant le nombre d'octets du fichier * grace à fstat et en le divisant par le nombre d'octets par ligne. * NB : on peut aussi trouver le nombre d'octets dans le fichier en prenant * la valeur retournee par "lseek(source,0,SEEK_END)" */ if (fstat(source,&sts) < 0) { perror("fstat"); exit(1); } nbLigne = sts.st_size/NBCAR; /* Ecriture de totoSdd.txt */ for (i = nbLigne-1 ; i >= 0 ; i--) { int nbRead, nbWrite; if (lseek(source, i*sizeof(ligne), SEEK_SET) < 0){ perror("lseek"); exit(1); } nbRead = read(source, ligne, sizeof(ligne)); if (nbRead != sizeof(ligne)){ if (nbRead < 0) { perror("read"); exit(1); } else { printf("On a lu moins de caractères que requis (ne devrait jamais arriver !)\n"); exit(1); } } nbWrite = write(dest, ligne, sizeof(ligne)); if (nbWrite != sizeof(ligne)){ if (nbWrite < 0) { perror("write"); exit(1); } else { printf("On a ecrit moins de caractères que requis (disque plein ?)\n"); exit(1); } } } if (close(source) < 0){ perror("close source"); exit(1); } if (close(dest) < 0){ perror("close dest"); exit(1); } return 0; }