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 :

Surcharge de la structure FILE


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut Surcharge de la structure FILE
    Salut à tous !
    A cette heure si tardive me vient une question un peu spéciale. De part le paradigme objet et le système de flux, je sais qu'il est possible de créer ses propres flux en C++. Mais en C standart, est-il possible de surcharger la structure FILE ? Du coup, les fonctions de fichiers (fread et fwrite) fonctionneraient mais on crochète le tampon pour y mettre le notre. Cela dit, il me semble que le système existant est bufferisé...

    Merci de votre attention.

  2. #2
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par ninfomane Voir le message
    Mais en C standart, est-il possible de surcharger la structure FILE ?
    La structure FILE est supposée être opaque pour l'utilisateur, c'est à dire que tu n'as pas besoin/le droit de regarder dedans. D'ailleur, il n'est pas sûr que cette structure soit la même d'une implémentation (linux/libc) à l'autre (windows/libc).

    Citation Envoyé par ninfomane Voir le message
    Du coup, les fonctions de fichiers (fread et fwrite) fonctionneraient mais on crochète le tampon pour y mettre le notre.
    Le système le fait déjà très bien.

    Citation Envoyé par ninfomane Voir le message
    Cela dit, il me semble que le système existant est bufferisé...
    Oui

    La vraie question, c'est pourquoi as tu besoin de toucher à cela ?

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ninfomane Voir le message
    En C standard, est-il possible de surcharger la structure FILE ?
    Ce n'est pas aussi souple qu'en c++, mais on peut faire des choses.
    On travaille plus au niveau des fonctions que de la classe elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    
    #ifdef OVERWRITE_PUTS
    #define puts(par) printf("avant puts\n");\
    puts(par); \
    printf("apres puts\n")
    #endif
    
    int main(void) 
    {
        puts("test");
        return 0;
    }
    Le résultat obtenu est
    si OVERWRITE_PUTS est défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    avant puts
    test
    apres puts
    sinon (comportement standard)

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    @ mabu : C'est correct ce que tu fais ?

    Ca me paraît bizarre de redéfinir ce qui à déjà été défini sans rien 'déréférencer'.

    J'aurais plutôt fait quelque chose comme ça (dîtes moi si c'est correct) :

    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
    #include <stdio.h>
     
    #define OVERWRITE_PUTS
     
    #ifdef OVERWRITE_PUTS
     
    #define my_puts puts
    #undef puts
     
    #define puts(par) printf("avant puts\n");	\
    	my_puts(par);				\
    	printf("apres puts\n")
     
    #endif
     
    int main(void)  {
    	puts("test");
    	return 0;
    }

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Ca me paraît bizarre de redéfinir ce qui à déjà été défini sans rien 'déréférencer'.
    En fait, la macro ne sera vue que par le préprocesseur.
    Le compilateur ne s'en rendra pas compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define puts(a) fun1(), puts(a), fun2()
    int main(void) 
    {
        puts("test");
        return 0;
    }
    Après préprocessing, on aura :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void) 
    {
        fun1(), puts("test"), fun2();
        return 0;
    }
    Il n'y a plus de confusion possible : le compilateur ne sait pas qu'une macro puts a existé.

    EDIT:
    la méthode utilisant my_puts et #undef n'est pas fausse, mais pas non plus indispensable.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    La méthode de mabu marche, mais uniquement parce qu'il est spécifié (pas la source sous le coude) que le préprocesseur n'effectue pas de remplacement récursif ET que ce n'est pas un élément du langage lui-même (j'ai des doutes sur la même chose fait avec un for, par exemple).

    Récursion : une fois la macro puts remplacée, il ne tente pas de voir si puts se référençait elle-même ou non, vu qu'elle vient d'être traitée => elle n'apparait plus dans le source en tant que macro, elle est donc ignorée par le préprocesseur.
    Le compilateur C, bien sûr, n'y voit que du feu, comme toujours avec les macros.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    La méthode de mabu marche, mais uniquement parce qu'il est spécifié (pas la source sous le coude) que le préprocesseur n'effectue pas de remplacement récursif ET que ce n'est pas un élément du langage lui-même (j'ai des doutes sur la même chose fait avec un for, par exemple).
    Dans le cas du for, je ne pense pas qu'il soit possible de faire cette manip (parce que dans les parenthèses, on trouve deux ";" ce qui est assez compliqué à traiter pour une macro.
    En revanche, pas de problème -a priori- pour des éléments comme if par exemple (testé le comportement est le même (avec gcc))

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    m'enfin je pense cependant que la notion même est à déconseiller très fortement

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    m'enfin je pense cependant que la notion même est à déconseiller très fortement
    C'est vrai,

    Mais cela reste très pratique quand on a des besoins de debug.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    m'enfin je pense cependant que la notion même est à déconseiller très fortement
    Pour un débutant ? Oui, tout à fait déconseillé en effet... Tout comme les macros plus complexes d'un #define de constante de façon générale, d'ailleurs.

    Par contre, en programmation (très) avancée destinée à des couches de portages / stub, cela peut avoir un intérêt non négligeable.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    sans doute, mais quand je lis le PO, je me dis que ce n'est pas son cas, et que c'est plutôt un cas de vouloir faire du C++ en C...

    PS : peut-être qu'on pourrait faire un forum "spécial problèmes expert" ?

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Désolé du temps de réponse... En fait, je ne reçois pas de notification.
    J'ai songé à ça à cause d'un projet en cours. En Java, je créais un flux (OutputStream) pour communiquer par le réseau. Ce flux était retourné par une méthode distante (genre RMI). Ce flux était surchargé pour justement communiquer par des méthodes distante.
    Du coup, je me demandais si c'était possible de faire la même chose avec le C. Mais sans redéfinir les méthodes, pour que le flux puisse provenir de n'importe quelle source.

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ninfomane Voir le message
    Du coup, je me demandais si c'était possible de faire la même chose avec le C. Mais sans redéfinir les méthodes, pour que le flux puisse provenir de n'importe quelle source.
    En C standard, non.

    La chose qui pourrait s'en approcher le plus --sans redéfinir de fonction--, serait l'utilisation de open/read (noter à l'absence de f) sur des descripteurs de fichiers : les fichiers locaux et des sockets peuvent être vues de la même façon... Mais on sort du C standard et on perd les avantages de FILE.

    Citation Envoyé par ninfomane Voir le message
    Désolé du temps de réponse... En fait, je ne reçois pas de notification.
    http://www.developpez.net/forums/usercp.php

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    OK, merci pour toutes vos réponses ! ;-)

Discussions similaires

  1. structure FILE : nom du fichier
    Par garok01 dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 07/08/2009, 07h43
  2. IPC - Files de messages - Structure des messages
    Par Mattius007 dans le forum C
    Réponses: 2
    Dernier message: 03/01/2007, 10h51
  3. la structure FILE
    Par elghadi_mohamed dans le forum C
    Réponses: 5
    Dernier message: 17/10/2006, 13h29
  4. Quelle structure Perl pour lire file texte formaté
    Par calima dans le forum Langage
    Réponses: 2
    Dernier message: 26/07/2006, 14h51
  5. champs de la structure FILE
    Par jexistetjs dans le forum C
    Réponses: 2
    Dernier message: 15/10/2003, 22h02

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