Rechercher : dans
Par :

C lecture fichier txt ligne par ligne

Dernière réponse le 26 oct 2009 à 11:35:03 jerémiethe7, le 20 jan 2008 à 18:33:51 
 Signaler ce message aux modérateurs

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.

Meilleures réponses pour « C lecture fichier txt ligne par ligne » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Fichier TXT VoirFormat TXT Un fichier TXT est un fichier texte, c'est-à-dire un simple fichier contenant du texte au format ASCII. Pour ouvrir ou modifier un tel fichier, il suffit d'utiliser le bloc-notes ou un éditeur de texte traditionnel.
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...

1

fiddy, le 20 jan 2008 à 19:14:02

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

Google is your friend

Répondre à fiddy

2

Mahmah, le 20 jan 2008 à 19:20:44

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.

Répondre à Mahmah

3

jerémiethe7, le 20 jan 2008 à 19:27:03

Oui mais avec un fgets je ne suis pas sure que je part du début de la ligne.

Répondre à jerémiethe7

4

fiddy, le 20 jan 2008 à 19:29:14

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
Google is your friend

Répondre à fiddy

5

jerémiethe7, le 20 jan 2008 à 19:31:13

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 ?

Répondre à jerémiethe7

6

Mahmah, le 20 jan 2008 à 19:38:22

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 ?

Répondre à Mahmah

7

fiddy, le 20 jan 2008 à 19:43:29

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'.

Google is your friend

Répondre à fiddy

8

jerémiethe7, le 20 jan 2008 à 19:43:29

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 ?

Répondre à jerémiethe7

9

fiddy, le 20 jan 2008 à 19:44:43

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.

Google is your friend

Répondre à fiddy

10

jerémiethe7, le 20 jan 2008 à 19:52:25

Comment tu fait pour lire la ligne jusqu'au /n vu que le prtotype est :
fscanf(fichier,"%s",nom);

Répondre à jerémiethe7

11

fiddy, le 20 jan 2008 à 19:55:00

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.

Google is your friend

Répondre à fiddy

12

Mahmah, le 20 jan 2008 à 19:59:00
  • +1

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.

Répondre à Mahmah

13

jerémiethe7, le 20 jan 2008 à 20:01:18

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.

Répondre à jerémiethe7

14

fiddy, le 20 jan 2008 à 20:03:12
  • +1

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 ;)
Google is your friend

Répondre à fiddy

15

jerémiethe7, le 20 jan 2008 à 20:06:02

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.

Répondre à jerémiethe7

16

jerémiethe7, le 22 jan 2008 à 19:19:34
  • +1

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

Répondre à jerémiethe7

17

fiddy, le 22 jan 2008 à 21:08:16

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.


}
Google is your friend

Répondre à fiddy

18

 Achillo83, le 26 oct 2009 à 11:35:03

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

Répondre à Achillo83
Collection CommentÇaMarche.net