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

 C++ Discussion :

Transmettre un fichier à une fonction


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Transmettre un fichier à une fonction
    Bonjour !

    Je cherche un méthode pour pouvoir transmettre un fichier à une fonction, comme une variable.

    Par exemple :
    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
     
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    ifstream firstFile("file1.txt"); 
    ifstream secondFile("file2.txt"); 
     
    int main()
    {
     fonction (firstFile);
     fonction (secondFile);
    }
     
    void fonction (/*??? */ file)
    {
     char chaine[255];
     file >> chaine;	                  
     while (!entree.eof()) 	      
     {
         cout << chaine[i]<<endl;    
         entree >> chaine[i];}	     
     } 			                  	      
     return 0;
    }
    Là où j'ai mis des points d'interrogations, je me demande donc si il y a un "type"(comme "int", "char" etc) pour transmettre le fichier ou si je dois m'y prendre autrement...
    Donc, pour que la fonction fonctionne avec le fichier 1 et le fichier 2 sans devoir faire 2 fonction différentes...

    J'espère que je me suis bien exprimé et que je ne raconte pas des inepties...

    Merci d'avance !

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Il n'y a pas de type "fichier" en C++. Par contre, on a les flux d'entrées / sorties. (cf FAQ)

    Voici ce que tu cherches à faire, grosso modo :
    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
     
    #include <fstream>
    #include <iostream>
    #include <string>
     
    void fonction (std::ifstream& file)
    {
    	std::string chaine;
    	while (file >> chaine)
    	{
    		std::cout << chaine << std::endl;
    	}
    }
     
    int main()
    {
    	std::ifstream firstFile("file1.txt");
    	std::ifstream secondFile("file2.txt");
     
    	fonction (firstFile);
    	fonction (secondFile);
     
    	return 0;
    }
    Les flux se passent par référence !

    Bonne continuation,

    Poukill

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Et accessoirement on test pas la fin d'un fichier via eof() :p
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ben si, eof est l'abréviation de End-Of-File

    Par contre celui qui s'en sert de condition d'arrêt d'une boucle s'expose à une boucle infinie à la moindre erreur de lecture (ce que tu voulais dire je suppose). On écrira donc plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	std::string chaine;
    	while (file >> chaine)
    	{
    		std::cout << chaine << std::endl;
    	}

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Exact. Par manque de temps j'ai pas relevé ce problème, j'avais juste corrigé son code.
    Code mis à jour...

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En effet, j'ai pas était assez précis : on ne test pas la fin d'un fichier sur eof comme condition de sortie d'une boucle .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour votre aide ! C'est tout à fait ça qu'il me fallait :-D

    Merci aussi pour la correction :-)

    @+

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    ?

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum

    Une petite précision qui a son importance en passant:

    De manière générale, les variables globales, c'est mal...

    Et c'est d'autant plus vrai lorsqu'il s'agit de fichiers, car cela signifie que le fichier est "verrouillé" par l'application jusqu'à ce qu'elle finisse... Ce qui n'est pas vraiment souhaitable

    De plus, lorsque l'on décide néanmoins d'avoir recours à une variable globale, c'est généralement en suivant la (très mauvaise) logique selon laquelle le fait que la variable soit globale nous évite d'avoir à la passer en paramètre aux différentes fonctions...

    En effet, une variable globale est, par définition, ... accessible à l'ensemble des fonctions...

    Cherchez l'erreur dans le fait d'envisager de la transmettre en paramètre à une fonction

    ton code d'origine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ifstream firstFile("file1.txt"); 
    ifstream secondFile("file2.txt"); 
     
    int main()
    {
     fonction (firstFile);
     fonction (secondFile);
    }
    devrait donc, au minimum être modifié en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        ifstream firstFile("file1.txt"); 
        ifstream secondFile("file2.txt");
        fonction (firstFile);
        fonction (secondFile);
        /* idéalement, main renvoie 0 ;) */
        return 0;
    }
    Cela n'empêchera pas que file1.txt et file2.txt soient verrouillés durant toute la durée de l'application, mais, au moins, cela justifiera de les passer en paramètre (et te donnera la bonne habitude d'éviter les variables globales comme la peste )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la bienvenue ;-)

    Je suis tout à fait d'accord avec toi, mais ce n'est pas vraiment moi qui choisit cela... En effet, j'ai un énoncé, mais je l'ai peut être mal interprété :

    - Tout d'abord, votre programme chargera en mémoire le dictionnaire ainsi que l'ensemble des lettres (...)
    - Ensuite, le jeu peut commencer.(...)
    J'en ai donc déduit qu'il fallait mettre les fichiers en mémoire dès le début, et non au fur et à mesure qu'on les utilisait (ici il y a deux fichiers pour les lettres, et un fichier pour le dictionnaire). Qu'en pensez-vous ?

    (ENONCE DU PROJET en complet (le paragraphe parlant des fichiers est sur la deuxième page))

    Merci en tous cas pour votre aide !

    PS : Musson, ce n'est pas au milieu de nulle part en Belgique ! Que pensez-vous de Clairefontaine ? ^^

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Noncolodei Voir le message
    Merci pour la bienvenue ;-)

    Je suis tout à fait d'accord avec toi, mais ce n'est pas vraiment moi qui choisit cela... En effet, j'ai un énoncé, mais je l'ai peut être mal interprété :



    J'en ai donc déduit qu'il fallait mettre les fichiers en mémoire dès le début, et non au fur et à mesure qu'on les utilisait (ici il y a deux fichiers pour les lettres, et un fichier pour le dictionnaire). Qu'en pensez-vous ?
    Et tu as eu tord: cela veut juste dire que la première chose à faire, c'est de lire le fichier

    Fais en outre attention au fait qu'ouvrir un fichier ne signifie absolument pas que le fichier est chargé en mémoire

    Pour charger un fichier en mémoire, cela peut très bien prendre une forme générique proche de
    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
    /* la signature de la fonction, pour pouvoir l'utiliser */
    Type readFile(std::string const& filename);
    int main()
    {
        std::string filename1("fichier1.txt");
        std::string filename2("fichier2.txt");
        Type first = readFile(filename1);
        Type second = readFile(filename2);
        /* suite du programme */
    }
    /* la définition de la fonction */
    Type readFile(std::string const& filename)
    {
        /* nous ouvrons le fichier nommé filename */
        ifstream ifs(filename.c_str());
        /* toute la lecture du fichier */
        return var;
    } /* le fichier est automatiquement fermé, car ifs est détruit lorsque l'on
       * quitte la fonction
       */
    En outre, du coté de ton prof, il y a des coups de pied queque part qui se perdent...

    Le SESE (Single Entry, Single Exit) ne doit absolument pas être obligatoire, bien qu'il soit généralement préférable de l'utiliser si, vraiment, il est naturel d'y recourir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. transmettre des données à une fonction par l'URL
    Par laurentSc dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2014, 17h10
  2. transmettre un fichier css à une fonction php
    Par DiverSIG dans le forum Langage
    Réponses: 2
    Dernier message: 04/02/2010, 15h38
  3. Réponses: 3
    Dernier message: 10/10/2006, 21h25
  4. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

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