Ecrire totalité des resultats d'un programme dans un fichier en C - C - Programmation
Marsh Posté le 09-12-2015 à 15:21:13
Solution ultra simpliste : remplacer tous les appels à printf() par une méthode à toi qui appelle elle même printf ET fait ton écriture sur le disque ?
Marsh Posté le 09-12-2015 à 15:41:21
Si tu es sous unix/linux/OSX, tee est ton ami:
$ program [arguments...] 2>&1 | tee outfile
Et pour windows, utiliser un port de tee:
wintee: https://code.google.com/p/wintee/
le tee des unix utilities: http://unxutils.sourceforge.net/
A+,
Marsh Posté le 09-12-2015 à 15:43:36
Bonjour ! Si vous êtes sous UNIX/Linux, la commande "script" peut être intéressante, ou alors la commande tee.
Bonne continuation !
Edit : Grillé par gilou
Marsh Posté le 09-12-2015 à 15:46:21
Note que si tu veux vraiment faire une trace complète de ton programme, il va falloir aussi suivre les input utilisateurs, et donc ça ne marchera pas aussi simplement.
Il va te falloir avoir un flag (log on/off) et un fichier de log, et une copie dans le fichier de sortie de tous les outputs et tous les inputs.
A+,
Marsh Posté le 09-12-2015 à 16:21:59
Les sorties sont souvent bufferisées. Donc, elles ne sont écrites qu'au bout d'un certain nombre d'octets, ou à la fin normale d'un programme.
Pour avoir des traces, il recommandé de vider le cache de temps en temps avec
fflush(stdout); |
Sinon, un rapide coup d'oeil me fait percevoir un gros problème classique de borne dans les lignes :
Nbchar=strlen(temp) ; |
En effet, dans une boucle for, on met généralement une relation inférieure dans la partie médiane, mais très très très rarement une relation inférieure ou égale, car souvent ça fait dépasser la limite, et c'est ce qui se passe ici. Par ailleurs, quand on fait une allocation pour une chaine, d'habitude on réserve un octet de plus que la longueur pour avoir la place de mettre le zéro binaire de fin de chaine. Ici, aucune place n'est prévue pour le zéro binaire de fin de chaine, et c'est la fuite mémoire assurée, le plantage typique du newbie.
Marsh Posté le 09-12-2015 à 21:41:03
Bonsoir à tous, merci pour vos conseils mais hélas, je suis débutante dans le domaine et il y a des commentaires que j'ai du mal à comprendre. (trop abstrait et compliqué pour moi!!!!!!!!!).
Le seul que j'ai un peu compris est le premier de gilou. J'ai donc essayé la commande suivante
./mon_programme [arguments] 2&1 | tee outfile
mais la console ne me propose pas le menu et donc rien ne se passe. Si je tape sur une lettre le menu de mon programme défile en boucle. Après avoir quitter le programme, je visualise dans mon dossier outfile le menu ecrit en boucle.
Comment avoir dans la console mon programme et les différents menus tout en redirigeant les résultats obtenus dans la console aussi.
Encore navrée de ne pas comprendre tous les conseils donnés.
Bonne soirée.
Axelle
Marsh Posté le 09-12-2015 à 22:23:22
Donc si je comprends bien, tu as essayé
./mon_programme fichier_test.txt 2>&1 | tee resultat.txt
C'est bien cela?
A+,
Marsh Posté le 09-12-2015 à 23:19:02
Oui c'est cela que j'ai tapé mais j'ai joins dans mon premier post un mauvais programme.
voici une partie de mon programme correct. Celui -ci fait appel en argument a un fichier-test.txt.
Désolée pour l'erreur
Code :
|
Marsh Posté le 10-12-2015 à 14:23:49
Bon, je te donne un élément de réponse:
Ça peut être fait pour les printf (quitte a faire un remplacement global printf -> printf_and_log) mais pas pour les scanf (y'a peut être moyen dans mais c'est nettement moins simple et j'ai pas le temps de me pencher dessus la).
Un petit fichier exemple pour que tu comprennes le principe:
Code :
|
A+,
Marsh Posté le 10-12-2015 à 23:21:42
Bon, après avoir cogité un peu plus, je t'ai trouvé une solution qui marche sans modifier ton code.
Code :
|
Code :
|
Comme j'ai pas de getline sur mon systeme, j'utilise celui (archi connu et utilisé) trouvé ici: http://www.opensource.apple.com/so [...] /getline.c
et le fichier exemple:
Code :
|
Je compile ainsi:
gcc -DSTDC_HEADERS -DLOGGING -o mylog1.exe mylog.c logging.c getline.c
Le -DSTDC_HEADERS est un flag uniquement utile pour getline.c donc ne pas en tenir compte
(j'aurais pu aussi allouer un buffer de 256 ou 1024 caractères et utiliser gets plutôt que getline, en espérant que l'utilisateur n'ait jamais l'idée de taper une ligne plus longue que ça )
Ça me fait un exécutable qui écrit en console et dans un fichier de log.
Si je compile sans le flag -DLOGGING ça me fait un exécutable qui écrit en console seulement.
Les seules modifs à faire à son code sont:
- ajouter #include "logging.h" en tête de tous ses fichiers utilisant printf ou scanf
- faire un appel à log_open (et en fin à log_close) dans son programme principal.
C'est donc vraiment quelque chose de minimaliste.
Voilou!
REMARQUE: il y a une différence ici entre un scanf en mode LOGGING et un scanf normal:
Un scanf normal lira éventuellement plusieurs lignes, jusqu'à ce qu'il ait lu autant de données qu'il en attend (ou qu'il soit en mode échec)
Celui en mode LOGGING ne lira les données que sur une seule ligne.
Vu le fonctionnement interactif de ce programme, cela ne m'a pas paru être une restriction rédhibitoire ici.
A+,
Marsh Posté le 09-12-2015 à 15:19:12
Bonjour, J'ai un programme principal de plus de 600 lignes de code. Je souhaite obtenir les résultats de mon programme dans unn fichier mais avoir toujours ces derniers dans ma console.
Y a-t'il un moyen de le faire sans écrire dans le progrmame à chaque fois que je fais un printf(), de faire fprintf() ou un gets() ?
J'ai essayé de faire en executant mon programme la commande suivant
Il y a bien la création d'un fichier resultat.txt mais rien est écrit dedans.
Quelqu'un pourrait-i m'aider ?
Je vous joins mon programme qui se lit via un fichier de structure et un fichier de fonction et qui est incrémenté par un fichier texte de données.