web-dev-qa-db-fra.com

printf n'imprimant pas sur la console

Je commence à utiliser le langage C. J'utilise Eclipse (juno) en tant que mon IDE et le plugin CDT installé. J'ai également décompressé mingw64 (GCC Compiler). J'ai écrit un programme très simple pour voir si cela fonctionne. Ceci est mon code :

#include <stdio.h>

int main()
{
    int age;
    printf("Hello, please enter your age:\n");
    scanf("%d", &age);
    printf("Your age is %d", age);
    return 0;
}

Le problème est que le tampon de sortie est rempli avec la valeur de chaîne du premier printf mais ne le renvoie pas sur la console. Je dois entrer un nombre, et alors seulement le tampon déverse toutes les données sur la console pour que je voie la console à peu près comme ceci:

1
Hello, please enter your age:
Your age is 1

au lieu de ce qui est attendu c'est:

Hello, please enter your age:
1
Your age is 1

Maintenant, j'ai découvert que je pouvais utiliser fflush(stdout) après le premier printf mais je ne pense pas que cette solution soit élégante, voire nécessaire. Des idées sur la façon dont je peux surmonter cela?

(~ ~ ~ ~] edit [~ # ~] - parce que j'apprends cela dans mon université, je ne peux pas utiliser tout ce qui n'a pas été appris dans le cours, donc je peux seulement utiliser printf et scanf

NEW EDIT - Je pense avoir trouvé une explication à cela. Comme je l'ai dit, j'écris dans la vue Console à l'intérieur d'Eclipse. La chose étrange est que si je compile et exécute le programme à partir de la ligne de commande de Windows, j'obtiens le résultat souhaité. Par conséquent, je pense qu'Eclipse est en train d'écrire la sortie dans un fichier et de la présenter dans la fenêtre de la console. Comment puis-je forcer Eclipse à ouvrir une véritable fenêtre de ligne de commande dans les configurations d'exécution?

34
Mr T.

Apparemment, c'est un bogue connu d'Eclipse. Ce bogue est résolu avec la résolution de WONT-FIX. Je ne sais pas pourquoi cependant. voici le lien: bug de la console Eclipse C .

20
Mr T.

La sortie est tamponnée.

stdout est mis en ligne par défaut, ce qui signifie que '\ n' est supposé vider le tampon. Pourquoi cela ne se produit-il pas dans votre cas? Dunno. Besoin de plus d'informations sur votre application/environnement.

Cependant, vous pouvez contrôler la mise en mémoire tampon avec setvbuf ():

setvbuf(stdout, NULL, _IOLBF, 0);

Cela forcera stdout à être mis en tampon de ligne.

setvbuf(stdout, NULL, _IONBF, 0);

Cela forcera stdout à ne pas être tampon, vous n'aurez donc pas besoin d'utiliser fflush (). Notez que cela affectera gravement les performances des applications si vous avez beaucoup d’impressions.

21
kliteyn

Essayez de définir ceci avant d’imprimer:

setvbuf (stdout, NULL, _IONBF, 0);
7
user1500049

Vous pouvez essayer d'écrire sur stderr plutôt que sur stdout.

fprintf(stderr, "Hello, please enter your age\n");

Vous devriez également jeter un oeil à this fil pertinent.

6
Kitchi

Comme d'autres l'ont souligné, la sortie peut être mise en mémoire tampon dans votre programme avant qu'une console ou que Shell puisse la voir.

Sur les systèmes de type Unix, y compris les macs, stdout dispose par défaut d'une mise en mémoire tampon basée sur les lignes. Cela signifie que votre programme vide son tampon stdout dès qu'il voit une nouvelle ligne.

Cependant, sur les fenêtres, les nouvelles lignes ne sont plus spéciales et la mise en mémoire tampon totale est utilisée. Windows ne prend pas du tout en charge la mise en mémoire tampon des lignes. voir la page msdn sur setvbuf .

Donc, sur Windows, une bonne approche consiste à éteindre complètement stdout la mise en mémoire tampon comme ceci:

setvbuf (stdout, NULL, _IONBF, 0);
4
Tyler
  1. Dans votre dossier de projet, créez un fichier texte ".gdbinit". Il contiendra votre configuration de débogueur gdb
  2. Éditez “.gdbinit”, et ajoutez la ligne (sans les guillemets): “set new-console on”
  3. Après avoir construit le projet, cliquez avec le bouton droit sur le projet Debug> "Configurations de débogage", comme indiqué ci-dessous. Debug configuration

  4. Dans l'onglet "débogueur", assurez-vous que le "fichier de commandes GDB" pointe maintenant vers votre fichier ".gdbinit". Sinon, entrez le chemin d'accès à votre fichier de configuration ".gdbinit": Gdb configuration

  5. Cliquez sur "Apply" et "Debug". Une ligne de commande DOS native doit être lancée comme indiqué ci-dessous Console

1
babyinEclipse

Ajouter c:\gygwin\bin à PATH variable d’environnement en tant que variable d’environnement système ou dans votre projet Eclipse (propriétés-> exécuter/debug-> éditer)

1
user2838962