C lecture fichier txt ligne par ligne
Résolu
jerémiethe7
Messages postés
152
Date d'inscription
Statut
Membre
Dernière intervention
-
letrancheur Messages postés 210 Date d'inscription Statut Membre Dernière intervention -
letrancheur Messages postés 210 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'aimerai lire un fichier txt ligne par ligne. Le but serai de commencer la lecture lorque la ligne commencera par "<TD NOWRAP align".
J'ai essayé de faire quelque trucs mais vu que j'ai essayé avec le fscanf et une chaine, au 1er espace on change de chaine.
Voici un bout de mon code :
int i,j,nb=0;
int etatlecture;
char nom[100];
FILE*fichier=NULL;
fichier=fopen("palmares[1].txt","r");
if (fichier!=NULL)
{
etatlecture=fscanf(fichier,"%s",nom);
while (strncmp("<TD NOWRAP align",nom,2)!=0)
{
etatlecture=fscanf(fichier,"%s",nom);
}
// d'autres instructions....
}
Quand je compile pas d'erreurs mais j'obtient des chaines qui ne sont pas les lignes des mots.
J'avais déja essayé avec un fgets et des fseek pour changer de lignes mais vu que les lignes n'ont pas toutes la meme taille, c'est difficile.
Help please !!!
Merci.
j'aimerai lire un fichier txt ligne par ligne. Le but serai de commencer la lecture lorque la ligne commencera par "<TD NOWRAP align".
J'ai essayé de faire quelque trucs mais vu que j'ai essayé avec le fscanf et une chaine, au 1er espace on change de chaine.
Voici un bout de mon code :
int i,j,nb=0;
int etatlecture;
char nom[100];
FILE*fichier=NULL;
fichier=fopen("palmares[1].txt","r");
if (fichier!=NULL)
{
etatlecture=fscanf(fichier,"%s",nom);
while (strncmp("<TD NOWRAP align",nom,2)!=0)
{
etatlecture=fscanf(fichier,"%s",nom);
}
// d'autres instructions....
}
Quand je compile pas d'erreurs mais j'obtient des chaines qui ne sont pas les lignes des mots.
J'avais déja essayé avec un fgets et des fseek pour changer de lignes mais vu que les lignes n'ont pas toutes la meme taille, c'est difficile.
Help please !!!
Merci.
A voir également:
- Lire fichier ligne par ligne c
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Partager photos en ligne - Guide
- Fichier bin - Guide
- Mètre en ligne - Guide
18 réponses
efectivement j'y suis arrivé.
Pour ceux qui auront le meme pb que moi voici le code :
for (i=0;i<100;i++)
{
lettrenom=fgetc(fichier);
while (lettrenom != '\n')
{
nom[nb]=lettrenom;
nb++;
lettrenom=fgetc(fichier);
}
nom[nb]='\0';
printf("%s\n",nom);
strcpy(nom,"");
nb=0;
}
ça marceh nickel -> résolu
Pour ceux qui auront le meme pb que moi voici le code :
for (i=0;i<100;i++)
{
lettrenom=fgetc(fichier);
while (lettrenom != '\n')
{
nom[nb]=lettrenom;
nb++;
lettrenom=fgetc(fichier);
}
nom[nb]='\0';
printf("%s\n",nom);
strcpy(nom,"");
nb=0;
}
ça marceh nickel -> résolu
Je n'ai pas dit d'utiliser fscanf !
Soit tu le fais caractère par caractère jusque '\n'.
Soit tu fais avec un fgets, et tu regardes l'avant-dernier caractère du tableau.
Soit tu le fais caractère par caractère jusque '\n'.
Soit tu fais avec un fgets, et tu regardes l'avant-dernier caractère du tableau.
ah oui ok avec un fgetc. Tu prend une variable char [] et tu rajoute a chaque fois les caractère sue tu as dans le fgetc. quand tu fini ta ligne tu passe a la suivante et du coup on a plus besoin de prendre la taille de ta ligne, le fgetc passera tout seul a la ligne suivante c ça ?
après on boucle.
après on boucle.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Exactement ;), par contre ne prends pas un char [], mais un char tout court.
Tu fais une tite fonction, qui lit toute une ligne (jusqu'au '\n').
Et dans ta fonction principale, la boucle pour lire toutes les lignes.
Et après, tu auras un code tout propre ;)
Tu fais une tite fonction, qui lit toute une ligne (jusqu'au '\n').
Et dans ta fonction principale, la boucle pour lire toutes les lignes.
Et après, tu auras un code tout propre ;)
Bonjour,
la fonction fgets t'aidera normalement...
MSDN: fgets
Le seul soucis est qu'il faut définir un buffer assez grand pour contenir une ligne sans connaître cette taille au préalable.
Ca sent le bon gros #define en tête de fichier ça...
Evidemment si tu avais le droit au C++ tu n'aurais pas ce problème... (comme ça à tout hasard... tu peux ?)
M.
la fonction fgets t'aidera normalement...
MSDN: fgets
Le seul soucis est qu'il faut définir un buffer assez grand pour contenir une ligne sans connaître cette taille au préalable.
Ca sent le bon gros #define en tête de fichier ça...
Evidemment si tu avais le droit au C++ tu n'aurais pas ce problème... (comme ça à tout hasard... tu peux ?)
M.
Sinon il y a aussi... (mais c'est plus bourrin) mais là au moins tu n'auras pas de problème de taille de ligne.
Le petit bout de code qu'il y a là
cppfrance.com snippets
(les snippets sont des "comment telle action dans pleins de langage)
seul le C t'intéresse ici.
Ce bout de code sert à récupérer tout le fichier en mémoire, plutôt qu'une ligne.
Plus précisément il:
Ouvre le fichier, place le curseur de lecture (avec fseek ^^) à la fin pour connaître la taille du fichier.
aloue un bloc de mémoire pour stocker le contenu (avec malloc)
lit tout le fichier avec fread et la taille.
ferme le fichier (fclose)
libère la mémoire retenue par malloc avec free (quand tu en auras fini avec le contenu)
Ce que je propose la dessus c'est une fonction de plus: strtok (/!\ va modifier les données lues et stoquées en mémoire)
Grosso-modo celà découpe la grosse chaîne de caractères en mémoire en plusieurs petite à chaque fois qu'il rencontre un caractère donné
par exemple la chaîne pour la chaîne maChaine = "Bonjour"
r = strtok( maChaine, "j" );
r vaudra "bon"
puis en rappelant encore strtok sans premier paramètre
r = strtok( NULL, "j" );
r vaudra "our"
Tu peux faire ça avec lla copie en mémoire du fichier et le caractère "\n" (fin de ligne) et récupérer ainsi toutes les lignes une par une
M.
Le petit bout de code qu'il y a là
cppfrance.com snippets
(les snippets sont des "comment telle action dans pleins de langage)
seul le C t'intéresse ici.
Ce bout de code sert à récupérer tout le fichier en mémoire, plutôt qu'une ligne.
Plus précisément il:
Ouvre le fichier, place le curseur de lecture (avec fseek ^^) à la fin pour connaître la taille du fichier.
aloue un bloc de mémoire pour stocker le contenu (avec malloc)
lit tout le fichier avec fread et la taille.
ferme le fichier (fclose)
libère la mémoire retenue par malloc avec free (quand tu en auras fini avec le contenu)
Ce que je propose la dessus c'est une fonction de plus: strtok (/!\ va modifier les données lues et stoquées en mémoire)
Grosso-modo celà découpe la grosse chaîne de caractères en mémoire en plusieurs petite à chaque fois qu'il rencontre un caractère donné
par exemple la chaîne pour la chaîne maChaine = "Bonjour"
r = strtok( maChaine, "j" );
r vaudra "bon"
puis en rappelant encore strtok sans premier paramètre
r = strtok( NULL, "j" );
r vaudra "our"
Tu peux faire ça avec lla copie en mémoire du fichier et le caractère "\n" (fin de ligne) et récupérer ainsi toutes les lignes une par une
M.
oh là mahmad tu te démène pour moi c'est sympa. J'essairai ça demain et je vous tiendrai au courant si ça fonctionne ou pas.
Merci fiddy et mahmhad.
Merci fiddy et mahmhad.
Euh, c'est dommage de t'être embêter à ne pas vouloir effectuer des fgets avec de grands buffers, pour effectuer un code comme ça, tu ne résous absolument pas le problème. Si ta ligne est trop grande, ça va faire une erreur de segmentation pour ton buffer nom.
En gros, l'équivalent de ton code :
}
En gros, l'équivalent de ton code :
for(i=0;i<100;i++){ fgets(nom,sizeof nom,fichier); printf("%s\n",nom); } Et encore mieux, au lieu de for, tu peux utiliser la boucle while(! feof(fichier)) pour parcourir tout le fichier.
}
Si ta constante en début de fichier est suffisamment grande, tu n'auras aucun problème.
De plus, cette méthode te permettra d'éviter des failles de type buffer overflows.
Donc fixe toi bien la constante en début en fonction de tes besoins.
Cordialement
De plus, cette méthode te permettra d'éviter des failles de type buffer overflows.
Donc fixe toi bien la constante en début en fonction de tes besoins.
Cordialement
Ou alors je veins de penser a un truc :
Si je fait un fgets sur la 1ère ligne d'une taille bien supérieur à ce qu'elle est.
Je calcul la taille de la ligne.
Je fait un fseek pour passer a la ligne d'après en ayant le nombre d'octets de ma ligne précédente e tainsi de suite.
Comment on calcule la taille d'une ligne autrement que "manuellement" ? je crois que c'est strlen ou un truc du genre non ?
Si je fait un fgets sur la 1ère ligne d'une taille bien supérieur à ce qu'elle est.
Je calcul la taille de la ligne.
Je fait un fseek pour passer a la ligne d'après en ayant le nombre d'octets de ma ligne précédente e tainsi de suite.
Comment on calcule la taille d'une ligne autrement que "manuellement" ? je crois que c'est strlen ou un truc du genre non ?
En effet, si le buffer donné est trop petit pour contenir la ligne, la lecture reprendra là où elle s'était arrêté.
Si ce comportement t'est strictement interdit, augmente la taille du buffer, ce n'est pas 4ko de mémoire qui vont tuer un pc ! ^^
Ou
Vérifie que la lecture t'a donné une chaîne de taille inférieure au max
Si ce n'est pas le cas, c'est que tu es en train de lire une ligne en petits morceaux et il faut relire jusqu'à la terminer. (mais en pas de bol ça peut te faire manquer une ligne si une ligne a une taille multiple de ta taille de buffer...)
J'augmenterais la taille du buffer...
M.
ps:
donc C++ c'est non ?
Si ce comportement t'est strictement interdit, augmente la taille du buffer, ce n'est pas 4ko de mémoire qui vont tuer un pc ! ^^
Ou
Vérifie que la lecture t'a donné une chaîne de taille inférieure au max
Si ce n'est pas le cas, c'est que tu es en train de lire une ligne en petits morceaux et il faut relire jusqu'à la terminer. (mais en pas de bol ça peut te faire manquer une ligne si une ligne a une taille multiple de ta taille de buffer...)
J'augmenterais la taille du buffer...
M.
ps:
donc C++ c'est non ?
Salut,
Tout simplement, tu lis la ligne jusqu'à voir le '\n', condition de fin de ligne.
Ou si tu veux vraiment lire par fgets, tu effectues fgets tant que l'avant-dernier caractère n'est pas un '\n'.
Tout simplement, tu lis la ligne jusqu'à voir le '\n', condition de fin de ligne.
Ou si tu veux vraiment lire par fgets, tu effectues fgets tant que l'avant-dernier caractère n'est pas un '\n'.
mahmah je suis débutant en C et c'est le seul language que je connaise pour l'instant !!!
Autre chose c'est quoi le buffer ?
Autre chose c'est quoi le buffer ?
le buffer est une zone mémoire.
Généralement, lorsque tu fais un fgets, les données que tu vas récupérer vont être stocker dans un tableau que tu vas appeler buffer.
Généralement, lorsque tu fais un fgets, les données que tu vas récupérer vont être stocker dans un tableau que tu vas appeler buffer.
Je cherche a faire plus ou moins la même chose sauf que l'affichage des caractères par ligne dois s'arrêter avant la fin du nombre total de caractères sur ligne une idée?
Bien sur, il dois afficher les ligne suivant par après sur les lignes du tableau.
Voici ce que j'ai produis jusqu'à maintenant.