LINUX.ORG.RU

История изменений

Исправление gh0stwizard, (текущая версия) :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <errno.h>

void
error(char *msg)
{
        fprintf(stderr, "%s: %s\n", msg, strerror(errno));
        exit(EXIT_FAILURE);
}

int main()
{
        FILE *fd;
        long size = 0;
        wchar_t buff[7]; /* в слове Москва 6 букв + 1 для \0 */

        setlocale(LC_CTYPE, "en_US.UTF-8"); /* NOTES, man fgetws */

        fd = fopen("test", "r");
        if (fseek(fd, 0L, SEEK_END) == -1)
                error("fseek [1]");
        size = ftell(fd);
        if (fseek(fd, 0L, SEEK_SET) == -1)
                error("fseek [2]");
        fflush(fd);
        if (fgetws(buff, 7, fd) == NULL) /* <-- 7 это кол-во символов + \0 */
                error("fgetws");
        wprintf(L"size = %i: %ls\n", size, buff);
        return 0;
}

Все работает в gcc-5.3.0+musl-1.1.12 (даже без fflush()), gcc-4.7.2 + eglibc-2.13

man fflush

       For input streams associated with seekable files (e.g., disk files, but
       not pipes or terminals), fflush() discards any buffered data that has
       been fetched from the underlying file, but has not been consumed by the
       application.

Исправление gh0stwizard, :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <errno.h>

void
error(char *msg)
{
        fprintf(stderr, "%s: %s\n", msg, strerror(errno));
        exit(EXIT_FAILURE);
}

int main()
{
        FILE *fd;
        long size = 0;
        wchar_t buff[7]; /* в слове Москва 6 букв + 1 для \0 */

        setlocale(LC_CTYPE, "en_US.UTF-8"); /* NOTES, man fgetws */

        fd = fopen("test", "r");
        if (fseek(fd, 0L, SEEK_END) == -1)
                error("fseek [1]");
        size = ftell(fd);
        if (fseek(fd, 0L, SEEK_SET) == -1)
                error("fseek [2]");
        fflush(fd);
        if (fgetws(buff, 7, fd) == NULL) /* <-- 7 это кол-во символов + \0 */
                error("fgetws");
        wprintf(L"size = %i: %ls\n", size, buff);
        return 0;
}

Все работает в gcc-5.3.0+musl-1.1.12 (даже без fflush()), gcc-4.7.2 + eglibc-2.13

Исправление gh0stwizard, :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <errno.h>

void
error(char *msg)
{
        fprintf(stderr, "%s: %s\n", msg, strerror(errno));
        exit(EXIT_FAILURE);
}

int main()
{
        FILE *fd;
        long size = 0;
        wchar_t buff[7]; /* в слове Москва 6 букв + 1 для \0 */

        setlocale(LC_CTYPE, "en_US.UTF-8"); /* NOTES, man fgetws */

        fd = fopen("test", "r");
        if (fseek(fd, 0L, SEEK_END) == -1)
                error("fseek [1]");
        size = ftell(fd);
        if (fseek(fd, 0L, SEEK_SET) == -1)
                error("fseek [2]");
        fflush(fd);
        if (fgetws(buff, 7, fd) == NULL) /* <-- 7 это кол-во символов + \0 */
                error("fgetws");
        wprintf(L"size = %i: %ls\n", size - 1, buff);
        return 0;
}

Все работает в gcc-5.3.0+musl-1.1.12 (даже без fflush()), gcc-4.7.2 + eglibc-2.13

Исходная версия gh0stwizard, :

Буфферизированное чтение

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <errno.h>

void
error(char *msg)
{
        fprintf(stderr, "%s: %s\n", msg, strerror(errno));
        exit(EXIT_FAILURE);
}

int main()
{
        FILE *fd;
        long size = 0;
        wchar_t buff[7]; /* в слове Москва 6 букв + 1 для \0 */

        setlocale(LC_CTYPE, "en_US.UTF-8"); /* NOTES, man fgetws */

        fd = fopen("test", "r");
        if (fseek(fd, 0L, SEEK_END) == -1)
                error("fseek [1]");
        size = ftell(fd);
        if (fseek(fd, 0L, SEEK_SET) == -1)
                error("fseek [2]");
        fflush(fd);
        if (fgetws(buff, 7, fd) == NULL) /* <-- 7 это кол-во символов + \0 */
                error("fgetws");
        wprintf(L"size = %i: %ls\n", size - 1, buff);
        return 0;
}

Все работает в gcc-5.3.0+musl-1.1.12, gcc-4.7.2 + eglibc-2.13