Menu

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

fleur_du_mal 23 Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention - 2 juil. 2010 à 09:55 - Dernière réponse : fleur_du_mal 23 Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention
- 6 juil. 2010 à 09:16
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

Afficher la suite 

13 réponses

+3
Utile
#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é ?  
Char Snipeur 9679 Messages postés vendredi 23 avril 2004Date d'inscriptionContributeurStatut 9 mars 2018 Dernière intervention - 2 juil. 2010 à 12:05
+1
Utile
5
ou tout simplement getline() qui fait tout, tout seul.
http://man.developpez.com/man3/getline.3.php
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 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 9679 Messages postés vendredi 23 avril 2004Date d'inscriptionContributeurStatut 9 mars 2018 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 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 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 9679 Messages postés vendredi 23 avril 2004Date d'inscriptionContributeurStatut 9 mars 2018 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 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 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).
fleur_du_mal 23 Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention - 2 juil. 2010 à 10:35
0
Utile
merci je vais essayer ça
matthoffman 406 Messages postés lundi 24 mars 2008Date d'inscription 22 janvier 2013 Dernière intervention - 2 juil. 2010 à 10:48
0
Utile
Euuuh pas vraiment en fait, tu vas perdre enormement d'un point de vu appel systeme.

Utilise fget() ;)
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 2 juil. 2010 à 10:54
0
Utile
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,
0
Utile
en effet les fonctions fget et ses dérivées sont mieux que fread.
et initialiser char c=' ';
fleur_du_mal 23 Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention - 2 juil. 2010 à 12:37
0
Utile
merci à vous tous :)
fleur_du_mal 23 Messages postés jeudi 22 avril 2010Date d'inscription 26 août 2010 Dernière intervention - 6 juil. 2010 à 09:16
0
Utile
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.