/* Apparently, ftell() is affecting the stream position in the wide input case. The test program below should output fwrite succeeded 0: fgetwc returned '1' ftell returned 1 1: fgetwc returned '2' ftell returned 2 2: fgetwc returned '3' ftell returned 3 3: fgetwc returned '4' ftell returned 4 4: fgetwc returned '5' ftell returned 5 5: fgetwc returned '6' ftell returned 6 6: fgetwc returned 'x' ftell returned 7 dump: feof=1 ferror=0 ftell=7 but instead outputs fwrite succeeded 0: fgetwc returned '1' ftell returned 1 1: fgetwc returned '2' ftell returned 1 2: fgetwc returned '2' ftell returned 1 3: fgetwc returned '2' ftell returned 1 4: fgetwc returned '2' ftell returned 1 5: fgetwc returned '2' ftell returned 1 6: fgetwc returned '2' ftell returned 1 7: fgetwc returned '2' ftell returned 1 8: fgetwc returned '2' ftell returned 1 9: fgetwc returned '2' ftell returned 1 If the line invoking ftell() is disabled, then fgetwc() behaves correctly. */ #define _ISOC99_SOURCE #include #include #include #include #include int main(void) { FILE *fp; int r, n; if (!(fp = fopen("ftell-wideio-bug.test", "w+"))) { fprintf(stderr, "fopen failed!\n"); return EXIT_FAILURE; } r = fwrite("123456x", 1, 7, fp) - 7; fprintf(stderr, "fwrite %s\n", (r < 0) ? "failed" : "succeeded"); if (!(fp = freopen("ftell-wideio-bug.test", "r", fp))) { fprintf(stderr, "freopen failed!\n"); return EXIT_FAILURE; } if (!setlocale(LC_ALL,"en_US.UTF-8")) { fprintf(stderr, "setlocale failed!\n"); return EXIT_FAILURE; } n = 0; do { wint_t w = fgetwc(fp); if (w == WEOF) { fprintf(stderr, " dump: feof=%d ferror=%d ftell=%ld\n", feof(fp) != 0, ferror(fp) != 0, (long) ftell(fp)); break; } fprintf(stderr, "%2d: fgetwc returned '%lc'\n", n, w); #if 0 ftell(fp); #elif 1 fprintf(stderr, " ftell returned %ld\n", (long) ftell(fp)); #endif } while (++n < 10); return 0; }