diff --git a/projet_3.c b/projet_3.c index b517cafbf3d1386f1105cf83d8628df0e4a27819..e0dd7973b2775ab4f08c1d2961550ebfb54dcd7b 100644 --- a/projet_3.c +++ b/projet_3.c @@ -3,6 +3,7 @@ #include <string.h> #include <io.h> #include <sys/stat.h> +#include <sys/mman.h> #include <unistd.h> int is_div(int number, int i) { // Vérifie si i est un diviseur de number. @@ -91,7 +92,7 @@ void *afficherListe(list_t *liste) { // afficher la liste printf("NULL\n"); } -void ecrire_dans_fichier(char *input, char *output) { +void lecrire_dans_fichier(char *input, char *output) { int fichier_entree = open(input,O_RDONLY) ; // ouverture de fichier en mode lecture // O_RDONLY , O_WRONLY ou O_RDWR . // respectivement l'ouverture du fichier en lecture seule, en écriture seule ou en lecture / écriture. @@ -165,7 +166,77 @@ void ecrire_dans_fichier(char *input, char *output) { munmap(mapping, sizeof(int)) ; } } -/* int main() { + +void ecrire_dans_fichier(char *input, char *output) { // => en utilisant FILE on a plusieurs fonctions qui facilitenet la vie + + FILE * fichier_entree = NULL ; + fichier_entree = fopen(input, "r+") ; + // "r+": lecture et écriture. Vous pourrez lire et écrire dans le fichier. + // Le fichier doit avoir été créé au préalable. + FILE * fichier_sortie = NULL ; + fichier_sortie = fopen(output, "w+") ; + //"w+": lecture et écriture, avec suppression du contenu au préalable. + // Le fichier est donc d'abord vidé de son contenu, vous pouvez y écrire, + // et le lire ensuite. Si le fichier n'existe pas, il sera créé. + if (fichier_entree != NULL || fichier_sortie != NULL) { // si ca ne va pas + return; + } + + char *line = malloc(sizeof(int)) ; // j'alloue de la memoire pour line + while (fgets (line, sizeof(int), fichier_entree) != NULL) { + + int nombre = strtol(line,NULL,0) ; + // Cette fonction, signifiant string to long, permet de transformer une chaîne de caractères, contenant + // la représentation textuelle d'un entier, en un entier type long. + + void* mapping = mmap(NULL, sizeof(int),PROT_WRITE,MAP_SHARED,fichier_sortie,0) ; + /*Établir ne projection en mémoire des fichiers ou des périphériques ( + en qq sorte le malloc des fichier + argument : + 1er => L'adresse de départ de la nouvelle projection + 2eme => longueur + 3eme => PROT_WRITE On peut écrire dans la zone mémoire. + 4eme => MAP_SHARED Partager cette projection. + 5eme => fihcier + 6eme => ? + mmap() renvoie un pointeur sur la zone de mémoire, s'il réussit. En cas d'échec il retourne la valeur MAP_FAILED (c'est-à -dire (void *) -1) + http://manpagesfr.free.fr/man/man2/mmap.2.html + */ + + memcpy(mapping,line, sizeof(int)) ; + /*void * memcpy (void * dest, const void * src, size_t n) copie n caractères de la zone mémoire src vers la zone mémoire dest . + argument : + dest - Il s'agit du pointeur vers le tableau de destination où le contenu doit être copié, transtypé en un pointeur de type void *. + src - Il s'agit d'un pointeur vers la source des données à copier, transtypées en un pointeur de type void *. + n - Il s'agit du nombre d'octets à copier. + Cette fonction renvoie un pointeur vers la destination + https://www.tutorialspoint.com/c_standard_library/c_function_memcpy.htm + */ + + fputc((int) mapping, fichier_sortie) ; // Ecriture dans le fichier + list_t *liste = prime_divs(nombre) ; + if (liste == NULL) { + continue ; + } + else { + node_t *noued = liste -> head; + while (noued != NULL) + { + char *nombre_devient_char = NULL; + sprintf(nombre_devient_char, "%d", noued -> nombre_premier) ; + /* https://www.geeksforgeeks.org/sprintf-in-c/ + * int sprintf (char * str, const char * string, ...) + Au lieu d'imprimer sur la console, il stocke la sortie sur le tampon de caractères spécifié dans sprintf + */ + fputc((int) nombre_devient_char, fichier_sortie) ; + noued = noued -> next; + } + printf("\n"); + } + munmap(mapping, sizeof(int)) ; + } +} +/*int main(int argc, char *argv[]) { // test pour is_div(int number, int i) int number = 10 ; int number1 = 11 ; @@ -185,4 +256,4 @@ void ecrire_dans_fichier(char *input, char *output) { // je ne vois pas pq ca ne fonctionne pas printf("%d\n",afficherListe(liste)) ; return 0; -} */ \ No newline at end of file +}*/