#include #include #define TEMP_FILE_NAME "tempfile.tmp" #define MESSAGE "Kilroy was here\n" int main(int argc, char *argv[]) { FILE *file, *tempFile; char buffer[1024]; size_t bytesRead; size_t messageLength = 0; const char *messagePtr = MESSAGE; while (messagePtr[messageLength] != '\0') { messageLength++; } /* Vérification des arguments */ if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } /* Ouverture du fichier original en lecture-écriture */ file = fopen(argv[1], "r+"); if (file == NULL) { perror("Erreur d'ouverture du fichier"); return EXIT_FAILURE; } /* Création d'un fichier temporaire */ tempFile = tmpfile(); if (tempFile == NULL) { perror("Erreur de création du fichier temporaire"); fclose(file); return EXIT_FAILURE; } /* Écriture du message dans le fichier temporaire */ if (fwrite(MESSAGE, 1, messageLength, tempFile) != messageLength) { perror("Erreur d'écriture dans le fichier temporaire"); fclose(file); fclose(tempFile); return EXIT_FAILURE; } /* Copier le contenu du fichier original dans le fichier temporaire */ while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) { if (fwrite(buffer, 1, bytesRead, tempFile) != bytesRead) { perror("Erreur d'écriture dans le fichier temporaire"); fclose(file); fclose(tempFile); return EXIT_FAILURE; } } /* Retour au début des fichiers */ rewind(tempFile); rewind(file); /* Copier le contenu du fichier temporaire dans le fichier original */ while ((bytesRead = fread(buffer, 1, sizeof(buffer), tempFile)) > 0) { if (fwrite(buffer, 1, bytesRead, file) != bytesRead) { perror("Erreur d'écriture dans le fichier original"); fclose(file); fclose(tempFile); return EXIT_FAILURE; } } /* Tronquer le fichier au cas où il serait plus grand que le contenu écrit */ if (fflush(file) != 0 || ftruncate(fileno(file), ftell(file)) != 0) { perror("Erreur lors de la troncation du fichier"); fclose(file); fclose(tempFile); return EXIT_FAILURE; } /* Fermeture des fichiers */ fclose(file); fclose(tempFile); return EXIT_SUCCESS; } /*gcc -ansi -pedantic -o graffiti graffiti.c ./graffiti chemin_du_fichier*/