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 :

flux de saisie : fichier ou cin au choix


Sujet :

C++

  1. #1
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut flux de saisie : fichier ou cin au choix
    Je souhaite cr�er un interpr�teur, capable de lire cin ou un fichier, selon un argument de ligne de commande.

    Supposons le code suivant
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char*[] argv) {
    //validation des arguments 
     
    //sélection du flux
    istream input = (argc == 1 ? cin : ifstream(argv[1]));
     
    int x, y;
    input >> x >> y;
    cout << x << " : "<< y << endl;
    }
    Sauf que cela pose plusieurs probl�mes: le istream ne devrait pas �tre copi�, et il doit �tre modifiable.
    Cela correspond assez bien � une r�f�rence non constante.

    Certes, mais comment l'initialiser, sans cr�er un ifstream si j'utilise cin?

  2. #2
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 297
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 297
    Billets dans le blog
    2
    Par d�faut
    Salut,

    je n'aime pas manipuler les stream, donc perso je ferais une petite hi�rarchie de classe type template method, avec une fonction membre read(). Apr�s je ne sais pas si c'est la meilleure solution, ni si elle est adapt�e � tes besoins concrets.

  3. #3
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    F�vrier 2009
    Messages
    762
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2009
    Messages : 762
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    istream input = (argc == 1 ? istream(cin.rdbuf()) : ifstream(argv[1]));
    Par contre attention le buffer sera partag� entre input et cin. Tu peux aussi mettre un autre buffer (toujours avec rdbuf) sur cin en attendant et mettre un assert/exception pour �tre sur que tu t'en serviras pas entre temps... Tu peux aussi faire l'inverse et mettre le buffer de ton fichier dans cin... attention � la dur�e de vie par contre.

  4. #4
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    C'est ce probl�me de dur�e de vie qui m'emb�te.

    Un peu plus de d�tail:
    Je vais �crire une fonction void fonction(istream &);, et lui donner soit cin, soit un ifstream cr�� si n�cessaire.


    Je me retrouve avec une r�f�rence non-constante vers une ressource ch�re, et je n'arrive pas � initialiser conditionnellement.
    C'est ce probl�me que j'aimerai r�soudre.

    Est-ce qu'une solution � base de wrapper est envisageable?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void fonction(std::istream &);
     
    void fonction_sur_cin() {
        fonction(std::cin);
    }
     
    void fonction_sur_fichier(const char* chemin) {
        std::ifstream fichier(chemin);
        fonction(file);
    }


    Mon objectif r�el �tant cette fonction, c�ur d'une future biblioth�que, pas le main qui construit simplement un programme jouet autour de la fonction.

    Mon probl�me est assez th�orique, parce qu'ici, il disparait car je peux dupliquer le traitement qui suit.
    Comme j'autorise plusieurs fichiers d'entr�e, j'obtiens le code suivant:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void fonction(istream &);
     
    int main(int argc, char*[] argv) {
        if (argc==1) {
            fonction(cin);
        } else {
            for (int i = 1; i< argc; ++i) {
                //j'omets la vérification d'existence du fichier pour plus de clarté
                ifstream stream(argv[i]);
                fonction(stream);
            }
        }
    }

Discussions similaires

  1. lecture fichier avec cin
    Par InfoGitan dans le forum D�buter
    R�ponses: 23
    Dernier message: 05/02/2009, 15h16
  2. Saisie dans un DBEdit et choix automatique
    Par jojo86 dans le forum Bases de donn�es
    R�ponses: 2
    Dernier message: 22/02/2008, 14h46
  3. VS 2005 Envoyer le flux d'un fichier
    Par cyrilc dans le forum ASP.NET
    R�ponses: 1
    Dernier message: 28/09/2007, 16h39
  4. R�ponses: 1
    Dernier message: 02/01/2007, 19h55
  5. R�ponses: 5
    Dernier message: 20/03/2006, 12h35

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