J’ai un problème lorsque wprintf
fonctions printf
et wprintf
ensemble dans le code. Si la chaîne normale est imprimée en premier, alors wprintf
ne fonctionne pas. Si wprintf
abord wprintf
alors printf
ne fonctionnera pas.
#include #include #include #include int main() { setlocale(LC_ALL,""); printf("No printing!\n"); wprintf(L"Printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; }
Les sorties:
No printing! ASCII
Tandis que
#include #include #include #include int main() { setlocale(LC_ALL,""); wprintf(L"Printing!\n"); printf("No printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; }
les sorties:
Printing! Wide char
J’utilise gcc (GCC) 4.6.1 20110819 avec glibc 2.14 sur Linux 3.0 64 bits.
C’est à prévoir; votre code appelle un comportement indéfini. Selon le standard C, chaque stream FILE
est associé à une “orientation” (“octet” ou “large”) définie par la première opération effectuée sur celui-ci et pouvant être inspectée avec la fonction fwide
. les conflits d’orientation avec l’orientation du stream entraînent un comportement indéfini.
Pour compléter la réponse acceptée de R ..:
Bien que cela soit très rarement fait, vérifier le code de retour de printf
/ wprintf
indiquerait plus clairement que l’un d’eux ne fonctionne pas (il devrait retourner -1 pour la fonction d’impression qui est invalide selon l’orientation actuelle du stream).
Malheureusement, un modèle commun de vérification des erreurs dans les fonctions de bibliothèque standard:
if (wprintf(...) == -1) { perror("wprintf"); ... }
Peut ne pas aider beaucoup ici: si le stream est défini pour générer des caractères non larges et que vous appelez wprintf
, errno
peut ne pas l’être et vous obtiendrez wprintf: Success
, qui ne fournit pas beaucoup d’informations.
C’est donc un problème un peu difficile à comprendre lorsque vous ne connaissez pas l’orientation des stream dans les caractères.