Je crée un petit programme qui copie simplement le texte d'un fichier input.txt
dans un fichier output.txt
. Cela fonctionne sans problème apparent avec la commande:Texte imprimable masqué
./myCopier.txt <rand.txt> randout.txt
sur un compilateur GCC89, utilisé à des fins didactiques.
#include<stdio.h>
int main(void){
int c;
while ((c = getchar()) != EOF)
putchar(c);
/*The text in printf() does not appear anywhere*/
printf("My theories and toughts!\n");
}
Plus tard, j'ajouter printf()
afin d'imprimer mes réflexions sur la façon dont le programme a fonctionné. Il compile sans erreurs ou avertissements même avec des paramètres restrictifs (-Wall
), mais ce texte n'apparaît à aucun endroit. Par n'importe quel endroit, je veux dire à la fois output.txt
et la sortie standard.
Je pense que:
- La commande
./myCopier.exe
seule créer clairement une boucle sans fin. Sans saisie de texte, il n'y a pas de caractèreEOL
, donc la commandeprint()
n'est jamais atteinte. - Alors pourquoi, lorsque l'entrée est fournie, la commande
printf()
n'a aucun effet apparent? Je m'attendrais à ce que le texte deprintf()
apparaisse sur la sortie standard, juste au moment où la boucle se ferme etoutput.txt
est créé. Pourquoi cela ne se produit-il pas? Ma théorie est que./myCopier.txt <rand.txt> randout.txt
ne le permet pas. Pour une raison quelconque, cela fait que le programme ne transfère l'entrée qu'à la sortie, "ignorer" tout ne vient pas de l'entrée. Ai-je raison? Si oui, pourquoi?
Si vous êtes intéressé par le problème avec des détails plus profond, voici le code assembleur:
http://text-share.com/view/79f31f38
Pourriez-vous montrer quel assemblage est généré par votre compilateur? – Siguza
Aussi, si la mémoire me sert bien, l'autorisation d'omettre une instruction explicite 'return' dans' main() 'a été introduite dans C99, ce qui signifierait que la norme C89 invoque un comportement indéfini. – Siguza
Je pense qu'il y a un malentendu quelque part, que ce que vous pensez ne se produit pas. Le troisième point exigerait que quelque chose soit magique, pour faire cette comparaison. Peut-être avez-vous ajouté le 'printf()', mais avez échoué à recompiler après et continué à exécuter le vieux binaire? – unwind