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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Ces deux fonctions sont généralement utilisées avec fgets() :
Quand on fait une saisie de taille limitée, on ne veut généralement pas
de caractères parasites si l'utilisateur en tape trop
--> La première fonction sert à faire disparaitre les caractères en trop.
Ainsi, ils ne dépasseront pas sur la saisie suivante.
La seconde fonction sert à supprimer le \n qui est mis dans la chaîne par fgets().
Elle regarde d'abord s'il y a un \n dans la chaîne.
* S'il y en a un, on le vire.
* Sinon, c'est que l'utilisateur a tapé des caractères en trop :
On les fait disparaitre.
*/
void PurgeStream(FILE *in)
{
int c;
while((c=fgetc(in)) != '\n' && c != EOF) {}
}
void PurgeLineAndStream(char *s, FILE *in)
{
char *pLF = strchr(s, '\n');
if(pLF != NULL)
{
/* Si LF trouvé, le supprime du buffer */
*pLF = '\0';
}
else
{
/* LF non-trouvé: il est encore dans le flux */
PurgeStream(in);
}
}
/* Ici, on va lire des lignes de 100 caractères max.
Les caractères en trop seront ignorés.
*/
#define TAILLE_MAX 100
char* fichier_txt(const char *nom, int iLigne)
{
/* On commence par ouvrir le fichier, car il faudra toujours le fermer,
que la fonction réussisse ou non. */
char *buf = NULL;
FILE *fichier = fopen(nom, "r");
if(fichier == NULL)
{
/* L'ouverture a échoué. */
printf("Echec d'ouverture du fichier \"%s\".\n", nom);
}
else
{
/* Ouverture réussie.
On alloue la mémoire. */
buf = malloc(sizeof(*buf) * (TAILLE_MAX+1));
if(buf == NULL)
{
/* l'allocation a échoué */
puts("Echec d'allocation memoire.");
}
else
{
/* L'allocation a réussi.
On lit le fichier. */
int cpt = -1;
while(fgets(buf, TAILLE_MAX+1, fichier) != NULL)
{
/* On fait un PurgeLineAndStream après chaque fgets() */
PurgeLineAndStream(buf, fichier);
++cpt;
/* On sort si on a la chaîne qu'on voulait. */
if(cpt == iLigne)
break;
}/*while*/
/* En cas d'échec, cpt n'est pas égal à iLigne */
if(cpt != iLigne)
{
free(buf);
buf = NULL;
}
else
{
/* OK: On ne libère pas buf, puisqu'on le retourne. */
}
}/*if buf*/
fclose(fichier);
fichier = NULL;
}/* if fichier */
return buf;
}
int main(void)
{
char * result = NULL;
int iLigne = 7;
result = fichier_txt("fichier_data.txt", iLigne);
if(result != NULL)
{
/* Surtout pas de & ici : result est de type char*.
C'était une erreur aussi pour le tableau,
mais ça ne se voyait pas. */
printf("la chaine est donc : %s\n", result);
/* Le free() peut être dans le if() ou après,
car la norme garantit que free(NULL) ne fait aucun problème. */
free(result);
}
else
puts("Echec.");
system("PAUSE");
return 0;
} |
Partager