Signaler

Lire un fichier ligne par ligne en C [Résolu/Fermé]

Posez votre question fleur_du_mal 23Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention - Dernière réponse le 6 juil. 2010 à 09:16 par fleur_du_mal
Bonjour,

je souhaiterais savoir comment on peut lire un fichier ligne par ligne en langage C et stocker les donnees de la ligne lue dans une structure ou autre.

merci

Utile
+3
plus moins
#include <stdio.h>  
#include <stdlib.h>  

int main ()
 {  

    FILE * pFile;  
    char c;  

    pFile = fopen ( "monfichier.txt" , "r" );  
     
    while(c!=EOF)  
    {  
         while(c!='\n' && c!=EOF)  
         {  
               fread (c,sizeof(char),1,pFile);  
         }  
     }  

     fclose (pFile);  
     
return 0;  
}  

voila pour le principe après adapte le pour ta structure.
Cette réponse vous a-t-elle aidé ?  
Utile
+1
plus moins
ou tout simplement getline() qui fait tout, tout seul.
http://man.developpez.com/man3/getline.3.php
fiddy 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 18 octobre 2016 Dernière intervention - 2 juil. 2010 à 12:57
Sauf que getline() n'est pas standard. C'est même pas Posix.
En C, aucune fonction portable permet de lire une ligne entière dans un fichier. Il faut se la créer soi-même.
Char Snipeur 9664Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 6 mai 2017 Dernière intervention - 2 juil. 2010 à 15:05
pourtant elle est dans stdio et stdio est standard... pas très propre GNU sur ce coup là.
et si une fonction existe déjà, autant la récupérer (option GNU : source disponible).
fiddy 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 18 octobre 2016 Dernière intervention - 2 juil. 2010 à 16:35
pourtant elle est dans stdio et stdio est standard

Ouh là, raisonnement faux. Une extension GNU peut très bien être dans un header standard.
Un autre exemple : strerror_r() extension GNU et c'est défini dans string.h qui est standard. Pourtant strerror_r() n'est pas standard.

et si une fonction existe déjà, autant la récupérer (option GNU : source disponible).
Oui, et pas que GNU. D'ailleurs, c'est le principe des bibliothèques.

Dans tous les cas, getline() n'est pas portable, et si tu souhaites l'utiliser, il te faudra re-écrire la fonction. C'est ce que j'entendais par (se la créer soi-même). Il n'existe en C, aucune fonction portable permettant de lire une ligne entière dans un fichier.
Char Snipeur 9664Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 6 mai 2017 Dernière intervention - 2 juil. 2010 à 17:20
stdio.h est standardisé, une fonction qui ne l'ai pas ne devrai pas avoir sa place dans un en-tête standard, voilà ce que je voulais dire. Par exemple il y a unistd.h qui regroupe des standards POSIX je crois.
fiddy 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 18 octobre 2016 Dernière intervention - 2 juil. 2010 à 22:58
stdio.h est standardisé

Oui, j'ai jamais dit le contraire.

une fonction qui ne l'ai pas ne devrai pas avoir sa place dans un en-tête standard

Ne devrait ou pas, ça se discute. En tout cas, force est de constater que toutes les fonctions qui se trouvent dedans ne sont pas forcément standard. Par exemple, getline(). D'ailleurs, tu ne verras pas le prototype getline() implanté dans stdio.h sur un compilateur non GNU puisqu'il s'agit d'une extension GNU. Pour t'en convaincre t'as qu'à regarder le man que tu as donné dans ton premier post, tu verras qu'à aucun moment il est dit que getline() est standard.

Par exemple il y a unistd.h qui regroupe des standards POSIX je crois.

Oui, je n'ai pas dit le contraire. Mais il faut garder à l'esprit qu'un header regroupe des prototypes de fonctions ayant un même but. Par exemple stdio.h regroupe les entrées/sorties comme le fait getline(). Il n'empêche que cette dernière n'est pas standard.

Je maintiens, il n'existe pas de fonctions standards permettant de lire une ligne entière dans un fichier. Il faut se la créer (bien sûr on peut s'inspirer).
Utile
+0
plus moins
merci je vais essayer ça
Utile
+0
plus moins
Euuuh pas vraiment en fait, tu vas perdre enormement d'un point de vu appel systeme.

Utilise fget() ;)
Utile
+0
plus moins
Bonjour,
@Flog78
Il vaut mieux utiliser fgetc() que fread() pour ce genre d'exercice.
En plus, tu compares "c" à EOF alors que la variable "c" n'est pas initialisée lors de la première itération.

@Fleur_du_mal
A noter que tu peux utiliser la fonction fgets qui lit directement une ligne, mais à condition de savoir la longueur maximale d'une ligne.

Si tu veux un exemple, n'hésite pas à demander.

Cdlt,
Utile
+0
plus moins
en effet les fonctions fget et ses dérivées sont mieux que fread.
et initialiser char c=' ';
Utile
+0
plus moins
merci à vous tous :)
Utile
+0
plus moins
Bonjour,
j'ai une question concernant fscanf, je souhaiterais l'utiliser pour récupérer des données d'un fichier. par ailleurs ce que j'aimerais bien que mon fscanf fasse c'est qu'il prenne en compte les espaces aussi.

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !