#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main(int argc, char** argv) { if (argc < 2) { printf("%s usage: %s file\n", argv[0], argv[0]); exit(EXIT_FAILURE); } char* fichier = argv[1]; FILE *f; char *contenu; /* Ouverture du fichier */ if (!(f = fopen(fichier, "r"))) { printf("Impossible d'ouvrir %s en lecture : %s.\n", fichier, strerror(errno)); exit(EXIT_FAILURE); } /* Détermination de la taille */ fseek(f, 0, SEEK_END); int taille = ftell(f); /* Si le fichier est vide, on s'arrête. */ if (taille == 0) return 0; /* Si le fichier a une taille négative, il y a une erreur ! */ if (taille < 0) { printf("Erreur lors de l'appel à fseek : %s.\n", strerror(errno)); exit(EXIT_FAILURE); } /* On alloue la mémoire pour lire le fichier */ contenu = (char*) malloc((taille) * sizeof(char)); /* On se remet au début pour lire */ fseek(f, 0, SEEK_SET); /* On n'essaie de lire que si on veut lire au moins un caractère */ if (taille - 1 > 0) { /* On lit */ if (!(fread(contenu, 1, taille - 1, f))) { printf("Erreur lors de la lecture : %s.\n", strerror(errno)); exit(EXIT_FAILURE); } } fclose(f); /* On rouvre le fichier pour écriture */ f = fopen(fichier, "w"); /* On n'essaie d'écrire que si on a au moins un caractère à écrire. */ if (taille - 1 > 0) { /* On écrit le tout sauf le dernier octet */ if(!(fwrite(contenu, 1, taille - 1, f))) { printf("Erreur lors de l'écriture : %s.\n", strerror(errno)); exit(EXIT_FAILURE); } } fclose(f); return 0; }