IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

lecture d'un fichier texte


Sujet :

Réseau C

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 127
    Par défaut lecture d'un fichier texte
    Bonjour à tous

    Le code ci-dessous fonctionne tres bien, mis a part que je dois presser une touche à chaque fois pour afficher la ligne suivante, pourriez vous svp me donner une astuce afin qu'il lise le fichier texte en continu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
     
     
     
    main()
    {
    	FILE *fp;
    	char *str="c:\\remi.txt";
    	char *buffer=malloc(100);
     
     
    	if(buffer==NULL)
    	{
    		perror("\nErreur memoire");
    		exit(EXIT_FAILURE);
    	}
     
    	fp=fopen(str,"r");
     
    	if(fp==NULL)
    	{
    		perror("\nErreur fichier");
    		exit(EXIT_FAILURE);
    	}
     
    	do
    	{
    		fgets(buffer,100,fp);
    		printf("%s",buffer);
    		free(buffer);
    	}while(fp!=EOF);
     
    	fcloseall();
     
    	return 0;
    }
    Pour plus d'info voici un extrait du fichier texte:
    %
    O0001 (MOULE ASSEMBLÉ)
    N1 T1
    M16
    G0 G40 G80 G90 G54
    M3 S999
    (FRAISE CONIQUE FR_CONE-SACATEC40R-SA50)
    G0 X533.5 Y268.756
    G43 Z10. H1 M9
    (EBAUCHE DE LA RAINURE)
    (POSAGE PIECE USINAGE 2)
    Z2.
    G1 Z-1.3 F39
    X166.031 Y261.634 F52
    G3 X83.4 Y195. R86.65
    G0 Z2.
    Merci à tous

    A bientot

    Rémi

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, dans mes prgm, je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(fgets(buffer,100,p)!=NULL)
    {
     
    }
    Ensuite je teste si j'arrive à la fin du fichier où s'il y a eu une erreur.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par remi77
    Le code ci-dessous fonctionne tres bien,
    Ton code n'est pas portable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: warning: return type defaults to `int'
    main.c:6: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:8: warning: initialization discards qualifiers from pointer target type
    main.c:31: warning: comparison between pointer and integer
    main.c:33: warning: implicit declaration of function `fcloseall'
    Linking console executable: C:\dev\forums2\console.exe
    .objs\main.o: In function `main':
    C:/dev/forums2/main.c:33: undefined reference to `fcloseall'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 5 seconds)
    1 errors, 5 warnings
    Ton code ne fonctionne pas du tout

    Remarques et corrections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
     
    /* -ed-
    main()
     
    Les formes canoniques de main() sont :
     
    int main (void)
    et
    int main (int argc, char **argv)
    */
    int main (void)
    {
       FILE *fp;
    /* -ed-
       char *str = "c:\\remi.txt";
     
       merci de ne pas tripoter ma racine...
       */
       char *str = "remi.txt";
    /* -ed-
       char *buffer = malloc (100);
     
    pourquoi une allocation dynamique pour un petit buffer de taille fixe ?
    il ne faut pas compliquer le code inutilement.
     
       if (buffer == NULL)
       {
          perror ("\nErreur memoire");
          exit (EXIT_FAILURE);
       }
    */
       char buffer[100];
     
       fp = fopen (str, "r");
     
       if (fp == NULL)
       {
          perror ("\nErreur fichier");
          exit (EXIT_FAILURE);
       }
     
    /* -ed- suppression, voir ci-dessous
       do
       {
          */
     
          /* -ed-
          fgets (buffer, 100, fp);
     
          le tableau etant statique, on peut rendre le code 'auto-demerdant'
     
          fgets (buffer, sizeof buffer, fp);
     
          d'autre part, on doit utiliser la valeur retournee par la fonction
          de lecture pour savoir si la lecture a reussi. La forme canonique
          pour lire un fichier texte est :
          */
       while (fgets (buffer, sizeof buffer, fp) != NULL)
       {
     
          printf ("%s", buffer);
          /* -ed-
          free (buffer);
     
          horrible ! Un peu de bon sens SVP... On ne libere que quand on a plus
          besoin du bloc...
          */
       }
       /*
       while (fp != EOF);
     
       pure invention. Absurdite totale.
     
       Il faut cesser de coder au hasard et ouvrir un livre de C.
       */
     
    /* -ed-
    	fcloseall();
    	pas portable et plutot goret comme methode...
    */
       fclose (fp), fp = NULL;
     
       return 0;
    }

  4. #4
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par remi77
    char *buffer=malloc(100);
    ourf, faut pas malloc sans raison. Ca t'apportera des ennuis a l'avenir.

    Ceci est préférable pour le bien de la mémoire. Apres, c'est sur, ca depends si tu comptes developper ton programme.

    Personnellement j'utilise le bon vieu fread(). Simple, ca fonctionne bien, sans sucre ajouté.

    fcloseall();
    c'est assez barbare quand meme d'utiliser cette fonction pour un seul descripteur.

    while(fgets(buffer,100,p)!=NULL)
    {

    }
    Ca serait mieux oui.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 127
    Par défaut
    Bonjour à tous

    Emmanuel a ecrit :
    Ton code n'est pas portable
    Pourtant je l'ai compilé avec MS visual studio 6, avec des fonctions tout ce qu'il y a de plus classique, pourquoi il en est ainsi

    Stevie wonder a ecrit :
    Personnellement j'utilise le bon vieu fread(). Simple, ca fonctionne bien, sans sucre ajouté.
    Mais si je l'ouvre avec fread, il sera ouvert en mode binaire et les retours de ligne seront ignoré

    Ceci est préférable pour le bien de la mémoire. Apres, c'est sur, ca depends si tu comptes developper ton programme.
    Oui par la suite, je dois continuer le code pour modifier les valeurs x y et z, j'ai pris l'habitude d'utiliser malloc pour ne pas reserver trop de memoire inutilement. Disons que c'est plus une regle de conduite

    Merci a tous
    A bientot
    Rémi

  6. #6
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stevie Wonder
    Pour lire des lignes, c'est pas du tout adapté. fgets() est fait pour ça. Cesse d'embrouiller le débutant...

  8. #8
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pour lire des lignes, c'est pas du tout adapté. fgets() est fait pour ça. Cesse d'embrouiller le débutant...
    fread() est tout a fait adapté pour lire des lignes, du moment que tu l'utilises correctement. de plus fread() requiert un mode d'utilisation beaucoups moins feignant que fgets(). C'est pas plus mal d'utiliser une fonction de bas niveau avant les autres. Pedagogiquement parlant.
    De plus je lui ai pas ordonné de l'utiliser, je lui ai expliqué ce que moi j'aimais utiliser et je lui est designé le man, ce qui tu admetteras, est une bonne chose qu'il s'interesse a cette fonction, etant "debutant" comme tu le dis si bien.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stevie Wonder
    fread() est tout a fait adapté pour lire des lignes,
    Non[1]. Pas naturellement. Il faut scanner ce qu'on a reçu pour savoir où sont les fins de lignes. Il peut y avoir plusieurs lignes et/ou une ligne incomplète, les chaines ne sont pas formées : le 0 des fins de chaines doit être mis à la main.

    Le C suit certaines règles, il convient de les respecter. fread() n'est définitivement pas ce qu'il faut pour lire des lignes.
    du moment que tu l'utilises correctement. de plus fread() requiert un mode d'utilisation beaucoups moins feignant que fgets(). C'est pas plus mal d'utiliser une fonction de bas niveau avant les autres. Pedagogiquement parlant.
    Tout à fait d'accord avec le principe, mais mauvais choix de fonction. La fonction de bas niveau c'est fgetc().

    Je recommande de se construire sa propre fonction de lecture à base de fgetc().

    Théorie :

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc
    http://emmanuel-delahaye.developpez.com/inputs.htm

    Réalisations :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module IO

    ----------------
    [1] Mais je suis d'accord que la maitrise de cette technique est intéressante si on doit traiter des blocs de données brutes comme avec les sockets. Mais une chose à la fois. Résolvons déjà la saisie des caractères et la lecture de fichiers sans utiliser l'infâme *scanf().

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 127
    Par défaut
    Bonjour à tous

    Stevie Wonder a ecrit
    char buffer[100];
    etait préférable à l'utilisation de malloc

    Oui, mais j'ai pu remarqué que j'avais des problemes du genre
    error C2106: '=' : left operand must be l-value
    lorsque je n'utilise pas malloc, j'ai pourtant pu toujours lire que une chaine de caractere etait un tableau avec un suite de caractere se terminant par '\0'

    Et tout particulierement dans ce cas lorsque j'utilise une fonction qui retourne un pointeur vers une chaine de caractere.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    buffer=no_n(from_fgets_string);
    Pourriez vous m'en dire plus SVP

    Merci à tous

    Rémi

  11. #11
    Membre confirmé Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Par défaut
    Citation Envoyé par remi77
    Bonjour à tous

    Citation Envoyé par Stevie Wonder

    Ceci est préférable pour le bien de la mémoire. Apres, c'est sur, ca depends si tu comptes developper ton programme.
    etait préférable à l'utilisation de malloc

    Oui, mais j'ai pu remarqué que j'avais des problemes du genre
    error C2106: '=' : left operand must be l-value
    lorsque je n'utilise pas malloc.
    Bonjour,

    Il ne me semble pas que l’erreur vienne de la « non »utilisation de malloc.
    D’autre part pour le développement ultérieur de ton programme ou même pour sa maintenance je te conseillerais carrément de ne pas initialiser ton tableau « en dur » mais plutôt d’utiliser une macro du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef max
    #define max 100
    #endif
     
    int main(void)
    {
        char buffer[max];
    En cas de modification il te suffit de modifier la valeur de max.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par remi77
    Oui, mais j'ai pu remarqué que j'avais des problemes du genre
    <...>
    lorsque je n'utilise pas malloc, j'ai pourtant pu toujours lire que une chaine de caractere etait un tableau avec un suite de caractere se terminant par '\0'

    Et tout particulierement dans ce cas lorsque j'utilise une fonction qui retourne un pointeur vers une chaine de caractere.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    buffer=no_n(from_fgets_string);
    Problème de conception d'interface de fonction. Une fonction qui retourne une adresse doit stocker cette valeur dans un pointeur.
    ou la passer directement à une fonction qui attend une adresse.
    Un tableau, c'est différent. On le défini, puis on passe l'adresse de son premier élément à une fonction qui peut alors ecrire dedans si elle le veux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       T a[SIZE];
       f(a, SIZE);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 15h04
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo