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
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* -ed- ajoute void */
int main(void)
{
/* -ed-
char *buffer;
pointeur non initialise. Danger.
Il est préférable de lui donner tout de suite sa valeur nominale.
Deplace.
*/
char ligne[80] = "";
int i = 0;
//Execution de la commande HELP dans un fichier
/* -ed- attention, l'effet n'est pas portable. */
system("help > tmp");
//Ouverture du fichier
/* -ed-
FILE * file = fopen("tmp", "r");
Ok en C99, mais en C90, les variables doivent etre definies en
debut de bloc. */
{
FILE * file = fopen("tmp", "r");
//Lecture de la premiere ligne
/* -ed-
fscanf(file, "%80c", &ligne);
"%c" attend in char, pas l'adresse d'un tableau de char...
preferer fgets().
<a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
la fonction de lecture peut echouer.
*/
if (fgets(ligne, sizeof ligne, file) != NULL)
{
//allocation d'un espace memoire de la taille de la chaine recuperé
/* -ed-
buffer = (char*)malloc(strlen(ligne) + 1);
cast inutile. malloc peut echouer.
<a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
*/
{
char *buffer = malloc(strlen(ligne) + 1);
if (buffer != NULL)
{
/* -ed- comme on va utiliser strcat(), il faut initialiser buffer. */
*buffer=0;
//Tant que se n'est pas la fin du fichier on boucle
/* -ed-
while (!feof(file))
je ne sais pas qui enseigne cet usage de feof(), mais c'est faux.
<a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
on va utiliser le retour de la fontcion de lecture
*/
while (1)
{
//concatenation de buffer avec ligne
/* -ed- 'buffer' n'a pas ete initialise.
Le comportement est indefini.
Ajoute init avant la boucle.
*/
strcat(buffer, ligne);
//lecture de la ligne suivante
/* -ed-
fscanf(file, "%80c", &ligne);
*/
if (fgets(ligne, sizeof ligne, file) == NULL)
{
/* fin de lecture */
break;
}
#if 0
/* -ed-
ce n'est pas comme ca que l'on utilise realloc()
probleme de taille (manque un +1)
<a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
reecriture
*/
//Reallocation de l'espace en prenant compte de la taille de la nouvelle ligne
buffer = (char*)realloc(buffer, strlen(buffer) + strlen(ligne));
if (buffer == NULL)
{
// Si l'allocation echou, affichage d'un message et on sort de la boucle
/* -ed- manque un '\n'
printf("Probleme de memoire !");
<a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
*/
printf("Probleme de memoire !\n");
/* -ed-
system("PAUSE");
pas portable (et inutile) */
break;
}
#else
void *ptmp = realloc(buffer, strlen(buffer) + strlen(ligne) + 1);
if (ptmp != NULL)
{
buffer = ptmp;
}
else
{
printf("Probleme de memoire !\n");
break;
}
#endif
/* -ed- ajoute commentaire (aide a la lecture ) */
} /* while */
//Affichage du fichier charger
printf("%s\n", buffer);
//Liberation de l'espace memoire alloué
/* -ed- ajoute remise a NULL du pointeur */
free(buffer), buffer = NULL;
}
}
}
//Fermeture du fichier
/* -ed-
close(file);
fonction inconnue */
fclose(file), file = NULL;
}
/* -ed-
system("PAUSE");
pas besoin de ca avec Code::Blocks
*/
return 0;
} |
Partager