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   -
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.
A voir également:

18 réponses

jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
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
10
letrancheur Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   7
 
Bonjour,
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.
if (map!=NULL)
{
  do{
    do{
      carLu = fgetc(map);
      tabville[ligne][colonne]=atoi(&carLu);
      sprintf(TblMsg,"\x1b[1m%c",carLu);
      AfficherXY(TblMsg,posX+3,posY+4);
      posX+=2;
    }while (posX/2<wWidth/2-1-11);
  }while (posY/2<wHeight/2-6); 
  fclose(map);
}
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > letrancheur Messages postés 210 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de créer ton propre post :-). Celui-ci est résolu depuis presque 6 ans...
0
letrancheur Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   7
 
je l'ai également fait :)
0
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
Oui mais avec un fgets je ne suis pas sure que je part du début de la ligne.
4
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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.
4
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
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.
4

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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 ;)
3
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
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.
2
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
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.
2
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
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.
2
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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 :

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.


}
2
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
1
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
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 ?
1
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
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 ?
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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'.
1
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
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 ?
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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.
1
jerémiethe7 Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   32
 
comment tu fait pour lire la ligne jusqu'au /n vu que le prtotype est :
fscanf(fichier,"%s",nom);
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,

fgets() est la bonne solution. Tu n'as pas besoin de connaître la longueur. Tu te fixes une taille maxi avec un #define MAX 255 par exemple. Tu auras toute la ligne de stocker, pas plus, pas moins, et le tableau se terminera par \0.

Cordialement
0
Achillo83
 
Je suis un jeune camerounais étudiant en audit et contrôle de gestion qui cherche un logiciel pouvant convertir le fichiers textes en fichiers audio.
merci
-4