Fonction avec un type file* [Résolu]

Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
- - Dernière réponse : vercd7am
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
- 18 mai 2011 à 10:25
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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
0
Merci
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.
Commenter la réponse de vercd7am
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
0
Merci
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.
Commenter la réponse de vercd7am
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
0
Merci
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.
Commenter la réponse de vercd7am
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
0
Merci
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.
Commenter la réponse de vercd7am
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Dernière intervention
14 mai 2012
0
Merci
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.
Commenter la réponse de vercd7am

Vous n'êtes pas encore membre ?

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

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 et codes sources.

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