En C, chaines de caractères dans un fichier
Fermé
r2
-
10 août 2011 à 18:49
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 17 août 2011 à 20:21
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 17 août 2011 à 20:21
A voir également:
- En C, chaines de caractères dans un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Caractères ascii - Guide
- Ouvrir un fichier .bin - Guide
4 réponses
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
10 août 2011 à 19:36
10 août 2011 à 19:36
Bonjour,
Lorsque vous faites
liste[0] est un pointeur auquel il faut lui donné une adresse ! ( l'adresse d'un char ou d'un tableau de char [ou de tout type en fait, le type char* est aussi utilisé pour éviter de faire des calculs sur les adresses lorsqu'on utilise le type void* qui sert pour stocker les adresses de type différents] )
exemple :
Vous voyez s[0] récupère l'adresse de la chaîne "a" et s[1] celle de "b"
Pour lire un fichier utilisez fread avec une boucle,
exemple :
Lorsque vous faites
char *liste[80]ça créer un tableau de 80 pointeurs de type char, autrement dit :
liste[0] est un pointeur auquel il faut lui donné une adresse ! ( l'adresse d'un char ou d'un tableau de char [ou de tout type en fait, le type char* est aussi utilisé pour éviter de faire des calculs sur les adresses lorsqu'on utilise le type void* qui sert pour stocker les adresses de type différents] )
exemple :
#include <stdio.h> int main(void) { char *s[2]; char *a="hello world"; char *b="bonjour tout le monde"; s[0]=a; s[1]=b; printf("%s\n",s[0]); printf("%s\n",s[1]); return 0; }
Vous voyez s[0] récupère l'adresse de la chaîne "a" et s[1] celle de "b"
Pour lire un fichier utilisez fread avec une boucle,
exemple :
#include <stdio.h> int main(void) { char buffer[10]; size_t count,i; FILE *fichier; fichier = fopen("test.txt","r"); if(fichier) { while((count=fread(buffer,sizeof(char),10,fichier))){ for(i=0;i<count;i++) printf("%c",buffer[i]); } } fclose(fichier); return 0; }
J'ai essayé ce que tu m'as proposé, ca marche mais j'obtiens tout ce qui est dans le fichier dans une seule chaine de caractères, sauf que ce que je voudrais faire c'est enregistrer ma liste de noms dans un tableau (de pointeurs ?) selon un motif genre "%s" en employant fscanf.
J'ai essayé ce que tu m'as proposé, ca marche mais j'obtiens tout ce qui est dans le fichier dans une seule chaine de caractères, sauf que ce que je voudrais faire c'est enregistrer ma liste de noms dans un tableau (de pointeurs ?) selon un motif genre "%s" en employant fscanf.
ci dessous le programme que j'essaye de faire :
#define VRAI 0
#define T 128
FILE *fichier, *fichier_old;
int comp_file (void) {
char text[T];
char *liste[T], *liste_old[T];
int n= 0 , i, j;
printf ("Comparaison avec l'ancienne liste ... \n");
/* Mettre les noms dans le tableau liste */
while ( fscanf ( fichier, "%s", text ) != EOF )
{
liste[n] = text;
printf ( "%s\n", liste[n] ); // Test pour voir ce qu'il y a dans liste[n]
n ++;
}
i=n; //i indique le nombre d'elements dans liste
printf ( "Le repertoire de maintenant contient %d élements:\n", i );
/* Afficher les éléménts */
printf ("%s\n", liste[0] );
printf ("%s\n", liste[1] );
n=0; //réinitialise n
/* Mettre les noms dans le tableau liste_old */
while ( fscanf ( fichier_old, "%s", text) != EOF )
{ liste_old[n] = text; n++; }
j=n; // j indique le nombre d'elements dans liste_old
/* Afficher les élements */
printf ("Le répertoire d'avant contenait %d élements : \n", j );
for ( n=0; n<=j; n++ )
{ printf ("%s\n", liste_old[n] ); }
return (0);
}
Mon probleme c'est que la premiere boucle affiche la liste avec printf mais quand je veux "revoir" la liste, ca ecrit la derniere chaine de caractere du fichier :( J'aimerai savoir mon erreur svp.
#define VRAI 0
#define T 128
FILE *fichier, *fichier_old;
int comp_file (void) {
char text[T];
char *liste[T], *liste_old[T];
int n= 0 , i, j;
printf ("Comparaison avec l'ancienne liste ... \n");
/* Mettre les noms dans le tableau liste */
while ( fscanf ( fichier, "%s", text ) != EOF )
{
liste[n] = text;
printf ( "%s\n", liste[n] ); // Test pour voir ce qu'il y a dans liste[n]
n ++;
}
i=n; //i indique le nombre d'elements dans liste
printf ( "Le repertoire de maintenant contient %d élements:\n", i );
/* Afficher les éléménts */
printf ("%s\n", liste[0] );
printf ("%s\n", liste[1] );
n=0; //réinitialise n
/* Mettre les noms dans le tableau liste_old */
while ( fscanf ( fichier_old, "%s", text) != EOF )
{ liste_old[n] = text; n++; }
j=n; // j indique le nombre d'elements dans liste_old
/* Afficher les élements */
printf ("Le répertoire d'avant contenait %d élements : \n", j );
for ( n=0; n<=j; n++ )
{ printf ("%s\n", liste_old[n] ); }
return (0);
}
Mon probleme c'est que la premiere boucle affiche la liste avec printf mais quand je veux "revoir" la liste, ca ecrit la derniere chaine de caractere du fichier :( J'aimerai savoir mon erreur svp.
Selon moi, plutôt que fread, tu devrais utiliser la fonction getline (qui te renvoie toute une ligne de ton fichier sous la forme de char *, à chaque appelle, ça te donne la ligne d'après)
Tu auras plus de facilité pour enregistrer chaque nom dans une case de ton tableau de pointeurs (et comme le nombre de lignes du fichier est inconnu, il faudra ré allouer ce tableau de pointeur à chaque fois, pour ça, je t'oriente vers la fonction realloc).
ça donnerait en gros un
Réfère toi aux manuels pour la syntaxe exacte des arguments (que je n'ai plus en tête)
edit :
J'oubliais quelque chose d'important, pour la lecture d'un tableau il est généralement assez délicat d'utiliser une variable contenant la taille de ce tableau. Ici, le dernier appelle à getline mettra NULL à la derniere case de ton tableau, donc pour en lire le contenu, la boucle sera plus simple à reproduire n'importe ou dans le code sans devoir garder une variable qui garderait sa taille :
J'espère ne pas m'être trompé dans ce que tu voulais faire ;)
Tu auras plus de facilité pour enregistrer chaque nom dans une case de ton tableau de pointeurs (et comme le nombre de lignes du fichier est inconnu, il faudra ré allouer ce tableau de pointeur à chaque fois, pour ça, je t'oriente vers la fonction realloc).
ça donnerait en gros un
int i = 0; while ((tab[i++] = getline(arguments)) != NULL) { tab = realloc(taille actuelle + 1); }
Réfère toi aux manuels pour la syntaxe exacte des arguments (que je n'ai plus en tête)
edit :
J'oubliais quelque chose d'important, pour la lecture d'un tableau il est généralement assez délicat d'utiliser une variable contenant la taille de ce tableau. Ici, le dernier appelle à getline mettra NULL à la derniere case de ton tableau, donc pour en lire le contenu, la boucle sera plus simple à reproduire n'importe ou dans le code sans devoir garder une variable qui garderait sa taille :
int i = 0; while (tab[i] != NULL) { printf("%s\n", tab[i++]); }
J'espère ne pas m'être trompé dans ce que tu voulais faire ;)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 17/08/2011 à 20:23
Modifié par fiddy le 17/08/2011 à 20:23
Pour info, getline() nest pas une fonction standard.
Dsl pour mon temps de réponse, les vacances...
Merci pour vos infos :) je vais pouvoir essayer de me débrouiller avec tout ça, dans mon coin j'avais réussi en utilisant aussi struct mais sans pointeur, ca m'a evité les erreurs de segmentation, mais les pointeurs ont l'air vraiment incontournable alors je vais y travailler de ce pas... encore merci ;)
Merci pour vos infos :) je vais pouvoir essayer de me débrouiller avec tout ça, dans mon coin j'avais réussi en utilisant aussi struct mais sans pointeur, ca m'a evité les erreurs de segmentation, mais les pointeurs ont l'air vraiment incontournable alors je vais y travailler de ce pas... encore merci ;)
11 août 2011 à 20:51
il n'y a plus qu'à utiliser le type "fline2tab" pour stocker les lignes en utilisant la fonction get_file_lines puis de libérer la mémoire quand on en a plus besoin.. prend en charge les fichier texte avec sauts de ligne du type \r\n , \n\r et \n