Met plutôt une puissance de 2,Code:#define MAX_LEN 1000
Le compilateur (euh, plus très sûr que ce soit lui ^^') gère la mémoire par bloc,
Donc là tu perds potentiellement de l'espace.
(Si quelqu'un peu confirmer ou non ce serait pas de refus ^^)Code:
1
2
3
4
5
6
7
8
9
10 /* 8octets */ int x; char c1; char c2; /* 12octets (potentiellement) */ char c1; int x; char c2;
Pourquoi ta fonction treat a t-elle besoin d'un pointeur sur l'option ?Code:int treat(File* my_file, char* option);
Tu ne testes pas si tu peux copier la totalité de optarg dans my_file.path.Code:
1
2 strncpy(my_file.path, optarg, sizeof(my_file.path));
Tu devrais avoir quelque chose du genre :
Code:
1
2
3
4
5 if(strlen(optarg) <= MAX_LEN) strncpy(path, optarg, strlen(optarg)); else return EXIT_FAILURE;
T'y vas pas avec le dos de la cuillère xDCode:
1
2
3
4
5
6
7
8 long read_long(long* ret) /* Lis un long */ { char str[MAX_LEN] = {0}; if(read_string(str, 100)) /* [...] */ }
Tu veux un entier long (donc sur 64bits)
Et tu lui laisses 1000 caractères Oo
En plus tu n'en traites que 100 après =/
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 /* 2^64 = 18 446 744 073 709 551 616 soit 20 caractères */ #define MAXSIZELONG 20 + 1 /* [...] */ long read_long(long* ret) /* Lis un long */ { char str[MAXSIZELONG]; memset(str, 0, MAXSIZELONG); if(read_string(str, MAXSIZELONG)) /* [...] */
Bon sinon, il te reste plus qu'à mettre tout ça en modulaire ^^
voila un exemple d'explosion de code ^^
Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 /** main.c **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include "file.h" /* Base décimale */ #define BASE 10 /* 2^64 = 18446744073709551616 soit 20 caractères */ #define MAXSIZELONG 20 + 1 static int treat(char*, char); static int get_option(char* option); static int get_filename(char*); static int again(void); static void clean(void); static int read_string(char*, const int); static long read_long(long*); int main(int argc, char *argv[]) { int c; char path[MAX_LEN]; char option = ' '; c = getopt(argc, argv, "c:r:w:"); printf("%d : %d\n", sizeof(path), strlen(path)); if(c != EOF) { option = c; if(strlen(optarg) <= MAX_LEN) strncpy(path, optarg, strlen(optarg)); else return EXIT_FAILURE; } return (treat(path, option) == FAIL) ? EXIT_FAILURE : EXIT_SUCCESS; } static int treat(char* path, char option) { if(option == ' ' && get_option(&option) == FAIL) return FAIL; if(strlen(path) == 0 && get_filename(path) == FAIL) return FAIL; switch(option) { case 'r' : if(read_file(path) == SUCCESS) return SUCCESS; break; case 'c' : if(create_file(path) == SUCCESS) return SUCCESS; break; case 'w' : if(write_file(path) == SUCCESS) return SUCCESS; break; } path[0] = '\0'; return (again() == SUCCESS) ? treat(path, option) : FAIL; } static int get_option(char* option) { long ret; printf("\n\n\t zReader - Manipulez vos fichiers"); printf("\n\n\n\tMENU\n"); printf(" 1 - Lire un fichier\n"); printf(" 2 - Créer un fichier\n"); printf(" 3 - Ecrire dans un fichier\n"); printf(" 4 - Quitter\n\n"); do { printf(" Votre choix ? "); if(read_long(&ret) == FAIL) return FAIL; if(ret == 1) *option = 'r'; else if(ret == 2 || ret == 3) *option = 'w'; else if(ret == 4) return FAIL; } while(ret <= 0 || ret >= 4); return SUCCESS; } static int get_filename(char* path) { printf("\n Entrez le nom du fichier concerné : "); return read_string(path, MAX_LEN); } static int again(void) { int c; do { printf("\n Erreur. Recommencer ? (o/n) "); c = fgetc(stdin); clean(); } while(c != 'o' && c != 'n'); return(c == 'o') ? SUCCESS : FAIL; } static void clean(void) /* Nettoie le buffer */ { int c = 0; while ((c = getchar()) != '\n' && c != EOF); } static int read_string(char *str, const int length) /* Lis une chaîne de caractère */ { char *ptr = NULL; if(fgets(str, length, stdin) != NULL) { ptr = strchr(str, '\n'); if(ptr != NULL) *ptr = '\0'; else clean(); return SUCCESS; } clean(); return FAIL; } static long read_long(long* ret) /* Lis un long */ { char str[MAXSIZELONG]; memset(str, 0, MAXSIZELONG); if(read_string(str, MAXSIZELONG)) { *ret = strtol(str, NULL, BASE); return SUCCESS; } return FAIL; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /** file.h **/ #ifndef _FILE_H #define _FILE_H #include <stdio.h> /* Taille de chaîne maximale */ #define MAX_LEN 1024 /* Constantes pour les retours de fonction */ #define FAIL 0 #define SUCCESS 1 /* Lis un fichier */ int read_file(char* path); /* Crée un fichier */ int create_file(char* path); /* Ecrit dans un fichier */ int write_file(char* path); #endif
Tu fais quoi après ?Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 /** file.c **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "file.h" static int close_file(FILE*); int read_file(char* path) /* Lis un fichier */ { char str[MAX_LEN]; FILE *f; if((f = fopen(path, "r")) == NULL) return FAIL; printf("\n Contenu du fichier : \n\n"); if(fgetc(f) != EOF) { fseek(f, 0, SEEK_SET); while(fgets(str, sizeof(str), f) != NULL) printf("%s", str); } else printf(" Désolé, le fichier est vide !\n"); return close_file(f); } int create_file(char* path) /* Crée un fichier */ { FILE *f; if((f = fopen(path, "w")) == NULL) return FAIL; printf("\n Le fichier a été créé avec succès !\n"); return close_file(f); } int write_file(char* path) /* Ecrit dans un fichier */ { char str[MAX_LEN * 2], *stop; int len; FILE *f; if((f = fopen(path, "w")) == NULL) return FAIL; stop = "close_file"; len = strlen(stop); printf("\n Saisissez le texte à mettre dans le fichier"); printf("(pour fermer, tapez \"%s\") : \n\n", stop); while(fgets(str, sizeof(str), stdin) != NULL) { if(strncmp(str, stop, len)) break; fputs(str, f); } return close_file(f); } static int close_file(FILE* f) { return (fclose(f) == 0) ? SUCCESS : FAIL; }
La copie de fichiers ?
Des statistiques sur les fichiers ?
Recherche dans un fichier ?
... ^^