87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #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 <chemin_du_fichier>\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*/ |