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 :

Confrontation printf() / write()


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Confrontation printf() / write()
    Bonjour tout le monde,

    Si je post ici, c'est qu 'après avoir essayer pendant un long moment de résoudre mon problème je n'ai pas trouver d'explication ni de source de recherche. Je m'explique :

    Lorsque j’exécute un programme qui contient la fonction printf() ainsi que write() rien ne se passe tel que je le souhaite :

    en effet, lorsque je compile ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <unistd.h>
    #include <stdio.h.>
     
    int main()
    { 
        printf("salut");
        write("cava");
     
        return (0);
    }
    Mon terminal me sort un vieux : cavasalut , je sais que printf appel automatiquement write lors de son exécution et j'ai donc d'abord pensé que ce que je rentrer dans printf ce caler à la suite de la chaine de mon write.

    J'ai donc essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("salut");
    printf("\n");
    write("cava");
    et là comme par magie tout rentre dans l'ordre : salut endline cava.

    Voilà je galère avec ce problème depuis pas mal de temps et j'ai besoin de vous pour m'aider ou me donner des pistes de réflexion afin de savoir ce qui ce cache derrière ces deux fonctions sachant que j'ai tester un tas de code sans trouver d'explication logique.

    Ps : je n'ai pas trouvé d'info via mon amis GOOGLE ! o_O

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Il y a quelques problèmes avec ton code, dont deux qui l'empêchent d'être compilé.

    Un point de trop après le .h dans "#include <stdio.h.>" →"#include <stdio.h>" et surtout, il manque des arguments au write "write("cava");" → "write(STDOUT_FILENO,"cava",strlen("cava"));"

    L'ordre d'affichage inversé en sortie vient du fait que "printf" utilise ici des sorties bufférisée tandis que "write" fait une écriture immédiate. Si tu veux vraiment mélanger les deux types d'entrées/sortie, le plus simple est de vider le buffer de la libc avant d'appeler write:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ...
        printf("salut");
        fflush(stdout);
        write(STDOUT_FILENO,"cava",strlen("cava"));   /* = write(1,"cava",4); */
        ....
    ɹǝsn *sıɹɐlos*

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Les problèmes de mon code viennent du faites que j'ai recopié mon code en étant totalement ko hier soir aha en réalité il était compilable .

    Donc si j'ai bien compris fflush va vider le buffer et donc écrire directement ce qui était retenus en mémoire. Et ton
    STDOUT_fileno
    correspond donc à la sortie standard*?

    Merci pour ta réponse !

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Oui, STDOUT_fileno est bien le numéro de descripteur de fichier correspondant à la sortie standard.

    Les fonctions de bas niveau qui correspondent normalement à des appels système (open, read, write, close, lseek, etc. ) utilisent des descripteurs de fichiers (des entiers) pour identifier les fichiers sur lesquels ils travaillent.

    Les fonctions de haut niveau implémentés par la bibliothèque standard C (fopen, fread, fwrite, fscanf, fprintf, fgets, fclose, fflush, printf, fseek, etc.) utilisent des pointeurs de fichiers qui sont des structures opaques (FILE *).

    Quand un programme démarre, les trois flux d'entrée, de sortie et d'erreur sont préalablement connectés. Ce sont les pointeurs de fichiers stdin, stdout et stderr qui correspondent aux descripteurs 0, 1 et 2.
    ɹǝsn *sıɹɐlos*

Discussions similaires

  1. Printf & write
    Par jayfaze dans le forum C
    Réponses: 1
    Dernier message: 28/11/2007, 14h46
  2. printf et LARGE_INTEGER
    Par KORTA dans le forum C
    Réponses: 10
    Dernier message: 05/09/2003, 15h20
  3. les accents et printf
    Par remi77 dans le forum C
    Réponses: 5
    Dernier message: 07/07/2003, 20h53
  4. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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