История изменений
Исправление
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