Bonjour,
Je suis un débutant en C et je suis bloqué sur un programme. Je dois réaliser un projet qui consiste à créer une commande pour archiver des fichiers. Pour cela, je dois pouvoir stocker dans un seul fichier les contenus et information de plusieurs fichiers. Cependant je n'arrive pas à récupérer le contenu d'un fichier à archiver.
Donc j'ai ma structure :
Dans la consigne qu'on me donne, je dois avoir un type char[] pour le champ file, mais je ne sais pas comment je peux définir la taille de file en avance ! Vu que c'est dans une structure, je ne vois pas comment je pourrais allouer un tableau dynamique... Donc j'ai essayé avec char* pour récupérer des chaines de caractère dans file.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct fichier_info{ size_t path_length; //ok off_t file_length; mode_t mode; //ok time_t m_time; //ok time_t a_time; //ok char *nom_file; //ok char checksum[32]; // osef char path[100]; //ok char* file; };
Je n'ai pas de problème pour la plupart des champs, checksum représente l'empreinte md5 du fichier. Je ne sais pas ce que c'est parce que je ne me suis pas encore renseigné, mais je laisse ca de coter pour l'instant. Ce qui me dérange pour l'instant, c'est de pouvoir recopier le contenu d'un fichier dans le champ file. Je ne veux pas écrire directement le contenu dans un fichier, je voudrais qu'il soit dans la structure car c'est demandé dans la consigne et que pour extraire ca serait plus pratique.
Avant de vous montrer ma fonction archivage, je vous montre le fichier .txt que je tente d'archiver :
Puis ma fonction archivage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ca gaz ou quoi ??. f ezfùe cef vsd v ea gz rds sdv ds lol
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 void archivage(int c, char *arg[], int fn, int dd, int d) { // Pas besoin de s'occuper de fn, dd, d et c. arg[3] contient le fichier à archiver, et arg[2] le nom du fichier d'archive. struct fichier_info tab_info; printf("Fonction archivage\n"); int len,archive,i; FILE* dc; char buf[1024]; dd = c-3; char *r = "rb"; // J'ouvre le fichier archive (ou je le créé) if((archive=open(arg[2],O_WRONLY|O_CREAT|O_TRUNC|O_APPEND,S_IRWXU|S_IRWXG|S_IRWXO))<0) exit(1); //Cette boucle permet de prendre plusieurs arguments mais on s'en fout for(i=3;i<c;i++) { // Ouverture du fichier à archiver avec fopen (ouverture en binaire car r = "rb" struct stat st; if((stat(arg[i],&st) != 0)|((dc = fopen(arg[i],r))<0)) { printf("impossible d archiver %s ",arg[i]); continue; } // On complète la structure tab_info à partir d'ici tab_info.nom_file=arg[i]; char s[] ="okok"; printf("nom fichier : /! %s /! \n", tab_info.nom_file); strcpy(tab_info.path,chemin(arg[i])); printf("chemin : %s\n", tab_info.path); tab_info.path_length=strlen(tab_info.path)+1; strcat(tab_info.path,"\0"); tab_info.mode=st.st_mode; tab_info.a_time=st.st_atime; tab_info.m_time= st.st_mtime; // C'est ici que je tente d'insérer le contenu du fichier dans tab_info.file while(fread(buf,1024,1,dc)> 0) { printf(">>>>> CC <<<<<\n"); tab_info.file = strcat(tab_info.file, buf); } tab_info.file_length=st.st_size; printf("file : \n%s\nBuf : %d\n",tab_info.file); write(archive,&tab_info,sizeof(struct fichier_info)); fclose(dc); } close(archive); }
Et la il se passe un truc de fou, dans le while avec lequel j'appelle fread, CC ne s'affiche pas, donc on ne rentre pas dans la boucle (c'est sur, j'ai bien vérifié). MAIS leaffiche ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("file : \n%s\nBuf : \n",tab_info.file);Quand je mets toute la boucle while en commentaire, tab_info.file affiche des caractères bizarres (5-6 caractères hiéroglyphe). Donc du coup je ne pige que dalle, strcat remplirait tab_info.file de la fin du fichier alors qu'on entre même pas dans la boucle (quand elle n'est pas en commentaire)? Mais pourquoi ? Je suis sur qu'il y a une explication logique à cela, mais pour moi ca me semble complètement illogique ! fread ne touche pas à tab_info.file, rien ne devrait changer. Même en mettant fread tout seul, sans le strcat, la même chose s'affiche ! ... ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 file : s sdv ds lol
Bref vous l'aurez compris, ca me pique le crâne fortement cette histoire donc j'ai besoin de votre aide svp ! Merci d'avance
EDIT : J'ai utilisé deux différents open parce que je ne vois pas comment ouvrir en mode binaire avec open, et je n'ai pas vu de fonction tel que fopen, fread et fwrite en cours. Et je viens de modifier le dernier paragraphe qui donnait une fausse information.
EDIT 2 : Je n'ai pas le droit d'utiliser LA fonction system !
Partager