2011-06-09 3 views
0

Je modifie un gros code C. À des fins de test, j'ai dû rediriger stdout vers un fichier. J'ai utilisé ce code à cette fin: fp=freopen("OUT", "w" ,stdout) Maintenant, tous les appels printf écriront à fp. C'est un gros code, donc je ne veux pas rechercher tous les points de sortie et fermer le fichier avant chaque sortie. Que se passe-t-il si vous ne fermez pas le fichier? Y a-t-il un moyen de le rendre autoflush chaque fois que j'écris quelque chose dans le fichier?Problème de vidage printf

Répondre

4

setvbuf est probablement la voie à suivre:

setvbuf (fp, NULL, _IONBF, 0); 

Cela désactivera tout à fait en mémoire tampon. Soyez juste prêt pour le coup de performance inévitable. Vous devez également être conscient que cela ne videra qu'au niveau de la bibliothèque d'exécution dans de nombreux systèmes, cela ne provoquera pas nécessairement un vidage du support de stockage, comme le fera l'UNIX fsync(fileno(fp)).

Donc, même si votre programme se bloque, il ne servira à rien si le système d'exploitation tombe dans un tas de cris. Mais alors vous avez probablement plus de problèmes que de perdre un peu de sortie :-)


Mais, à moins que votre programme est plantage, vous devriez probablement vous inquiétez pas à ce sujet. dit ISO C99, en partie, que l'une des actions de exit(), et donc le retour de main(), est:

Ensuite, tous les flux ouverts avec des données mises en mémoire tampon non écrites sont vidées, tous les flux ouverts sont fermés, ...

Vos données seront donc émises quel que soit le cas.

+0

Il est également possible de définir la mise en mémoire tampon de ligne, qui est la valeur par défaut sur stdout. –

+0

@Jan: "default on stdout" _si il peut être déterminé de faire référence à un périphérique interactif._ – paxdiablo

+0

@Jan: Question: freopen modifie-t-il le mode de mise en mémoire tampon? Si c'est le cas, le "default on' stdout' "n'aura pas d'importance. –

1

Oui. Utilisez setvbuf avec _IONBF:

setvbuf(stdout, 0, _IONBF, 0); 
+0

La réponse de paxdiablo est bien meilleure car elle explique comment faire cela, mais aussi pourquoi elle est inutile/inutile. –

+0

@R ..: D'accord. Ma réponse a été ma petite contribution à Fastest Gun dans l'Ouest, comme d'habitude. Quand j'ai vu les améliorations de paxdiablo, j'ai pensé que je ferais mieux d'abandonner. ;-) –