Écrit par : audionuma 27 May 2017, 09:56
Bonjour,
dans https://github.com/audionuma/r128x, j'utilise l'instruction suivante pour afficher un indicateur de progression :
Code
printf("%3d%% \n\033[F\033[J", (int)(ratio));
https://github.com/audionuma/r128x/blob/master/r128x-cli/CliController.m, ligne 51
https://github.com/audionuma/r128x/issues/8 que lorsque on redirige la sortie de l'appli vers un fichier texte, cela inscrit un tas de caractères inutiles dans le fichier texte.
Je me suis donc dit qu'une solution possible serait de rediriger l'indicateur de progression vers
stderr, cela permettant que la progression soit affichée dans le terminal mais non incluse dans la redirection (qui, si j'ai bien compris, ne comprend que
stdout par défaut).
Malheureusement :
Code
fprintf(stderr, "%3d%% \n\033[F\033[J", (int)(ratio));
ne produit pas le résultat escompté (la progression ne s'affiche pas dans le terminal).
Un simple
Code
fprintf(stderr, "ici stderr\n");
affiche bien la chaîne dans le terminal.
Avez vous une piste à me suggérer ?
Merci.
Écrit par : Jaypee 27 May 2017, 16:03
Suggestion n°1 pas chère
- Documenter la commande awk ou la commande sed filtant les "escape sequences" et grep -v ^(.*?)\%$ qui va bien.
- Fournir le script shell qui va le faire
r128x ... | sed ... | grep -v ^(.*?)\%$ > file.txt
Suggestion n° 2
Doubler les fprintf par du logging
https://developer.apple.com/reference/os/logging
J-P
Écrit par : audionuma 27 May 2017, 21:38
Merci @Jaypee.
Bon, sed/awk/grep c'est une piste, bien sûr, mais ce n'est pas celle que je privilégie pour les utilisateurs. En fait, l'utilisateur suffisamment averti fera ça de lui même, je crois (ou il ira commenter la ligne dans le code source avant de compiler son propre binaire).
Et le logging mentionné https://developer.apple.com/reference/os/logging a un gros défaut :
Citation
Important
Unified logging is available in iOS 10.0 and later, macOS 10.12 and later, tvOS 10.0 and later, and watchOS 3.0 and later
Je roule moi même sous 10.10.5 et théoriquement l'appli est compatible pour les OS à partir de 10.6 inclus. Je regarde du côté de NSLog mais rien de probant jusqu'à maintenant.
Donc, je souhaite comprendre pourquoi ce qui marche dans
stdout ne marche pas dans
stderr en fait.
Et je rappelle que cette appli est uniquement Mac OS (heu ... macOS) , pas de problèmes de portabilité linux/bsd/...
Écrit par : audionuma 28 May 2017, 20:00
Bon, après plus amples investigations, je pense que le problème vient de la différence de mode de fonctionnement : stdout est bufferisé par défaut, tandis que stderr ne l'est pas.
Mais quelques expériences de forçage de bufferisation de stderr n'ont produit que des résultats ... insatisfaisants.
Écrit par : audionuma 30 May 2017, 14:48
Je suis finalement parvenu à mes fins je crois :
https://github.com/audionuma/r128x/tree/progress-on-stderr
1 - forcer stderr à bufferiser les lignes (comportement par défaut de stdout)
Code
setvbuf(stderr, NULL, _IOLBF, 128);
2 - écrire l'indicateur de progression dans
stderrCode
fprintf(stderr, "%3d%% \n\033[F\033[J", (int)(ratio));
3 -
flusher stderr avant d'essayer d'écrire dans
stdoutCode
fflush(stderr);
printf(...);