
Envoyé par
drevlav
je galere sur mon tout petit code depuis deux jours a cause de cette fonction que je n arrive pas a faire marcher.
voici le topo
tout d abord j ouvre un fichier : "../list_test.txt"; la fopen marche.
ce fichier contient une liste de fichier que je dois ouvrir successivement, et c est la que ca ne marche plus:le plus bisard c est que fopen marche juste pour la derniere iteration du while.
1 2 3
|
char *p1 = malloc (17);
p1 = "../list_test.txt"; |
Ceci n'a aucun sens. En effet, tu alloues un bloc mémoire et tu perds son adresse en modifiant une deuxième fois le pointeur. Pour faire une copie de chaine, on utilise strcpy().
1 2 3 4 5 6 7 8 9 10
|
char *p1 = malloc (17);
if (p1 != NULL)
{
strcpy (p1, "../list_test.txt");
/* usage... */
free (p1);
} |
Mais n'est-ce pas une façon compliquée d'écrire :
1 2
|
char const *p1 = "../list_test.txt"; |
Au fait, 'p1' est un identificateur horrible pour un nom de fichier... Pourquoi pas 'fname', 'ficname', 'nomfic' etc. Il est important de bien choisir les identificateurs :
- Ca montre qu'on maitrise son sujet
- Ca permet une maintenance aisée.
FILE *f = fopen (p1, "rt"); /* ouvre en lecture */
Est incorrect. "rt" n'est pas standard. C'est une extension (peu utile) de Borland C. Utiliser la forme standard :
FILE *f = fopen (p1, "r"); /* ouvre en lecture */
while (fgets (line, 256, f) != NULL) /* essai lecture ligne */
est très laid. line n'est pas défini, et la taille est en dur. Préférer :
1 2 3
|
char line[256];
while (fgets (line, sizeof line, f) != NULL) /* essai lecture ligne */ |
BUG
Ensuite, garder en mémoire que fgets() prends le '\n'. Il faut donc commencer par l'éliminer proprement.
http://emmanuel-delahaye.developpez....tes.htm#saisie
http://emmanuel-delahaye.developpez....s.htm#fichiers
Je te laisse continuer...
Partager