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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 40

    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))

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