Lire un fichier ligne par ligne en C

Résolu/Fermé
fleur_du_mal Messages postés 23 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 26 août 2010 - 2 juil. 2010 à 09:55
fleur_du_mal Messages postés 23 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 26 août 2010 - 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

A voir également:

8 réponses

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

Utilise fget() ;)
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 juil. 2010 à 10:54
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
en effet les fonctions fget et ses dérivées sont mieux que fread.
et initialiser char c=' ';
0
fleur_du_mal Messages postés 23 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 26 août 2010 1
2 juil. 2010 à 12:37
merci à vous tous :)
0
fleur_du_mal Messages postés 23 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 26 août 2010 1
6 juil. 2010 à 09:16
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.
0