Skip to content
Extraits de code Groupes Projets
Valider 2806822b rédigé par Jean-Baudouin Zimer's avatar Jean-Baudouin Zimer
Parcourir les fichiers

projet_3.c supprimé

parent bc491130
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Pipeline #2043 réussi
#include <stdio.h>
#include <stdlib.h>
#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.
return (number % i == 0) ; // revoi 0 si le nombre n'est pas divisible par i et 1 si il est divisible
}
int is_prime(int number) { // Vérifie si number est un nombre premier. Return 1 si il est premier, 0 sinon
for (int i = 2 ; i < number ; i++) { //regarde les differents nombres pouvant etre diviser number
if (is_div(number,i) == 1) { // si i peut diviser number
return 0 ; //renvoi 0 => FAUX
}
}
return 1 ; //sinon => VRAI
}
// travail en likendList
typedef struct node { // creation d'un node
struct node *next; // prochain
int *nombre_premier; // nombre_premier
}node_t;
typedef struct list {
int size; // taille de mon noeud
node_t *head ; // tete de mon noeud
} list_t;
list_t *init_node(int value, struct list *list) { // initialsier ma liste avec un premier noued
struct node *nouveau = malloc(sizeof(*nouveau)) ; // allouer de la memoire pour nouveau
if (nouveau == NULL) { // si malloc ne focntionne pas
return NULL ;
}
nouveau -> nombre_premier = (int *) value; // donne la valeur au noued
list -> head = nouveau ; // donne une valeur a head
list -> size = list -> size + 1 ;
nouveau -> next = NULL ; // suivant est NULL
return list ;
}
void add_node(list_t *list, int value) { // si ne fonctionne pas 1 sinon 0
struct node *nouveau = malloc(sizeof(*nouveau)) ; // allouer de la memoire pour nouveau
if (nouveau == NULL) { // si malloc rate
return ;
}
if (list == NULL) {
return;
}
nouveau -> nombre_premier = (int *) value ; // donne une valuer a nouveau
nouveau -> next = list -> head ; // ajoute son pointeur
list -> head = nouveau ;
list -> size = list -> size + 1 ; // augmente la taille de la liste
}
list_t * prime_divs(int number) {
// creation d'une stack pour emagasiner les différents nombre premier
int premier = 0 ; //pour que se soit le premier de La liste
list_t *list = NULL ;
for (int i = 2 ; i < number ; i++) {
if (is_prime(i) == 1 && is_div(number , i) == 1) { // si i est premier et divise number
if (premier == 0) { // si c'est le premier nombre initialise ma liste
list = init_node(i,list) ; // j'initialise ma liste
premier = 1 ; // ne reviens plus ici
}
else {
add_node(list,i) ; // je le mets dans ma liste
}
}
}
return list ;
}
void *afficherListe(list_t *liste) { // afficher la liste
if (liste == NULL) {
exit(EXIT_FAILURE);
}
node_t *noued = liste -> head;
while (noued != NULL)
{
printf("%d ", noued -> nombre_premier);
noued = noued -> next;
}
printf("NULL\n");
}
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.
struct stat memoire ; // création de l'espace de la mémoire
if (fstat(fichier_entree,&memoire)) {
close(fichier_entree) ;
return;
}
/*fstat () obtient des informations d'état sur l'objet spécifié par le descripteur de descripteur ouvert et stocke les informations
* dans la zone de mémoire indiquée par l' argument tampon
* (Entrée) Le descripteur pour lequel les informations doivent être récupérées.
* (Sortie) Un pointeur vers un tampon de type struct stat dans lequel les informations sont retournées.
* Valeur de retour => 0 fstat () a réussi. Les informations sont renvoyées dans la mémoire tampon .
* => -1 fstat () n'a pas réussi. La variable globale errno est définie pour indiquer l'erreur.
*/
int fichier_sortie = open(output,O_WRONLY,|O_TRUNC|O_CREAT) ; // ouverture du fichier en mode ecriture
if (fichier_entree == -1 || fichier_sortie == -1) { // si les fichier ne s'ouvrent pas correctement
return;
}
int check = ftruncate(fichier_sortie, memoire.st_size) ;
if (check == -1) {
close(fichier_entree) ;
close(fichier_sortie) ;
return;
}
char *line = malloc(sizeof(int)) ; // j'alloue de la memoire pour line
while (fgets (line, sizeof(int), (FILE *) fichier_entree) != NULL) { // lire les ligne du fichier input
// https://openclassrooms.com/forum/sujet/lire-un-fichier-ligne-a-ligne-48056
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, (FILE *) 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) ;
fputc((int) nombre_devient_char, (FILE *) fichier_sortie) ;
noued = noued -> next;
}
printf("\n");
}
munmap(mapping, sizeof(int)) ;
}
}
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 ;
int i = 2 ;
printf("%d\n",is_div(number,i)) ; // 1
printf("%d\n",is_div(number1,i)) ; // 0
// test pour is_prime(int number)
int number2 = 1498498411 ;
int number3 = 5 ;
int number4 = 14545144 ;
printf("%d\n",is_prime(number2)) ; // 0
printf("%d\n",is_prime(number3)) ; // 1
printf("%d\n",is_prime(number4)) ; // 0
//prime divis
int numbre5 = 14 ;
list_t *liste = prime_divs(numbre5) ;
// je ne vois pas pq ca ne fonctionne pas
printf("%d\n",afficherListe(liste)) ;
return 0;
}*/
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter