Fonction avec un type file* [Résolu]

Signaler
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012
-
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012
-
Bonjour,

j'ai ecrit quelques lignes de code pour pouvoir lire un fichier txt.

int main()
{
    int c;
    FILE *fichier = NULL;

    fichier = fopen("C:\\cygwin\\home\\czdiv\\Titrebis.txt","r");

    int i=0;

    if (fichier == NULL)
    {
        printf("Fichier pas ouvert\n");
    }
    else
    {
        char lis[200];
        while( (c=fgetc(fichier)) != 9 )
        {
            lis[i]=c;
            printf("%c",lis[i]);
            i++;
        }
    }
    fclose(fichier);

    return 0;
}


Jusque la rien d'extraordinaire et je n'ai pas rencontre specialement de proleme.

J'aimerai bien ecrire une fonction avec un type file* pour faire la lecture du fichier, fichier que j'aurai ouvert avant, pour pouvoir l'appeler quand je veux comme je veux. Mais la ca bloque.

void lecture(FILE *fichier)
{
    int l;
    int j=0;
        char lec[200];
        while( (l=fgetc(fichier)) != 9 )
        {
            lec[j]=l;
            printf("%c",lec[j]);
            j++;
        }
    }
}


Je ne comprends pas pourquoi le compilateur dit que je fais une erreur. fgetc veut un pointeur sur file, je lui fait une fonction avec un pointeur comme ca et ca ne marche pas. Quel est le probleme ?

Merci d'avance

11 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Tu as bien mis #include <stdio.h> dans lecture.c ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Quel est le problème ?
Compilation ou exécution ?

Chez moi ça compile très bien. Aucun souci à passer un FILE* en argument.

Un bon exemple ici:
http://www.cplusplus.com/reference/clibrary/cstdio/fgetc/

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

Le probleme est lors de la compilation.

Le corps que j'avais ecrit c'etait pour tester ce que je faisais, et ca marche, et c'est ecrit d'une facon assez moche. L'idee pour rendre ca joli, et surtout beaucoup plus utilisable pour moi, c'est de remplacer tout ce qu'il y a dans la fonction entre l'ouverture du fichier et sa fermeture par la fonction que j'ai ecrite pour avoir en gros quelquechose du genre

#include <stdio.h>
#include <stdlib.h>
#include "lecture.h"

int main()
{
    FILE *fichier = NULL;

    fichier = fopen("C:\\cygwin\\home\\czdiv\\Titrebis.txt","r");

    int i=0;

    if (fichier == NULL)
    {
        printf("Fichier pas ouvert\n");
    }
    else
    {
    lecture(fichier);
    }

    fclose(fichier);



    return 0;
}


ou le lecture(fichier) est la fonction que j'ai ecrite. Mais a la compilation il me renvoie une erreur comme quoi dans la fonction lecture.c et apparement aussi dans le .h, il attend ) avant *, ce qui est pour moi completement absurde.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Je peux voir le fichier source que tu essaies de compiler, ainsi que l'erreur exacte et complète ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

Oui sans probleme

Le fichier que je veux lire ressemble a ca

DEMAQUILLANTr camomille 125 ml

avec apres camomille un tab et derriere 125 egalement (pour les besoins de mon test).

Le programme que j'ai ecrit ressemble a ca

#include <stdio.h>
#include <stdlib.h>
#include "lecture.h"

int main()
{
    int c;
    FILE *fichier = NULL;

    fichier = fopen("C:\\cygwin\\home\\czdiv\\Titrebis.txt","r");

    int i=0;

    if (fichier == NULL)
    {
        printf("Fichier pas ouvert\n");
    }
    else
    {
        char lis[200];
        while( (c=fgetc(fichier)) != 9 )
        {
            lis[i]=c;
            printf("%c",lis[i]);
            i++;
        }
    }
    lecture(fichier);

    fclose(fichier);



    return 0;
}
avec les ajouts suivants
void lecture(FILE *fichier);
pour lecture.h
void lecture(FILE *fichier)
{
    int l;
    int j=0;
    char lec[200];
    while( (l=fgetc(fichier)) != 9 )
        {
            lec[j]=l;
            printf("%c",lec[j]);
            j++;
        }
    
}
pour le .c

En fait la fonction est juste une reprise de ce que j'ai ecrit avant, pour pouvoir lire d'une certaine facon ce que je veux a l'endroit ou je le veux (la ou je viens de m'arreter de lire).

La premiere partie utilisee seule lit bien

DEMAQUILLANTr camomille,

mais la ou je voudrais lire ensuite 125 en faisant appel a ma fonction, ben le programme ne se lance meme pas et me renvoie une erreur de compile.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Tu es sur que c'est une erreur de compilation ? Et pas une erreur d'exécution ?
Parce que ça compile chez moi... Je suis sur que c'est un souci d'exécution (compilation ok, mais le programme n'a pas le bon comportement).

En revanche, je vois un potentiel problème d'exécution. Tu lis ton fichier, mais une fois le curseur à la fin, tu ne peux pas relire ton fichier une 2ème fois...
Donc soit tu fermes et tu réouvres le fichier (bof) soit tu te remets au début de celui-ci (fonction rewind, qui veut dire rembobiner en français).

Ex:
  rewind(fichier);
  lecture(fichier);
  rewind(fichier);
  lecture(fichier);


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

ben il me renvoie a chaque fois

error : expected ')' before '*' token
build finished 1 errors, 0 warnings

pour le fichier void lecture(FILE *fichier){}

Par contre, grandement merci, je viens d'apprendre quelquechose. Je croyais que si je faisais un fclose(fichier) la prochaine fois que j'aurais fait un fopen(fichier), il me l'aurait reouvert au debut. En soi ca ne change pas grand chose ici parceque je voudrais l'ouvrir une seule fois et pas a chaque fois, mais c'est bon a savoir.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Dans lecture.h pardon. Pense à mettre une garde aussi.

lecture.h
#idndef LECTURE_H_
# define LECTURE_H_

# include <stdio.h>

void lecture(FILE *fichier);

#endif /* !LECTURE_H_ */


Une garde te permet d'inclure plusieurs fois le même fichier, sans conflit. Puisque seul la première inclusion comptera.
Sans garde, tu verras que tu auras beaucoup de souci :)

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

Merci pour la reponse, effectivement j'avais oublier la bibliotheque.

En ce qui concerne la garde, dois-je comprendre que si je reutilise plusieurs fois ma fonction, sans avoir fait une garde dans le .h, lorsque j'appelerai ensuite a X reprises cette fonction, cela risque de poser probleme ?

Je ne comprends pas bien le principe du truc.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Non, ça te permet juste d'être sûr que ton fichier est inclu une seule fois:

Sans garde:
#include "monfichier.h" /* Inclu le contenu de monfichier.h */
#include "monfichier.h" /* Erreur de compilation, tout ce qu'il y avait dans fichier.h est inclus une 2ème fois,
et il y a un conflit de fonction (le compilateur va trouver tes fonctions en double, et il ne comprendra pas) */
#include "monfichier.h" /* Erreur de compilation, ... */
#include "monfichier.h" /* Erreur de compilation, ... */


Avec garde:
#include "monfichier.h" /* Inclu le contenu de monfichier.h */
#include "monfichier.h" /* Ne fais rien */
#include "monfichier.h" /* Ne fais rien */
#include "monfichier.h" /* Ne fais rien */


Équivaut alors à:
#include "monfichier.h"


Ça à l'air bête comme ça, mais lorsque tu as plusieurs fichiers qui s'appellent entre eux, qui ont chacun des dépendances dont certaines parties identiques, avoir cette sécurité te facilitent grandement la vie.

Fais un test par toi même avec et sans garde, tu comprendras mieux.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

Merci beaucoup pour cette explication. Maintenant je comprends mieux le truc, en vraiment gros, c'est un peu comme lorqu'on definit plusieurs fois une meme variable dans une meme fonction.