2 つの問題があります。1) このコードをテストすると、buf の前に余分な文字がいくつか表示されます。(ファイルが空の場合、何らかの理由で fsize が 3 に設定されます)。
2) ファイルに utf-8 文字が含まれており、コンソールに正しく表示されません。ロケールを LC_ALL に設定しようとしましたが、効果がないようです。
void display_title(void)
{
FILE *fh;
char *buf;
long fsize;
fh = fopen("title.txt", "r");
if (fh == NULL)
{
fprintf(stderr, "Unable to open title.txt for read\n");
return;
}
fseek(fh, 0L, SEEK_END);
fsize = ftell(fh);
rewind(fh);
buf = malloc(sizeof(char)*fsize);
fread(buf, fsize, 1, fh);
fclose(fh);
fwrite(buf, fsize, 1, stdout);
free(buf);
}
編集:だから私はファイルのエンコーディングをチェックする関数を書きましたが、まだ何かがおかしいです。ファイルを確認したところ、UTF_8 であることがわかりましたが、関数に登録されていません。どこかにバグがある気がしますが、見当たりません。
// Check for BOM in file
// ERROR : file too small
// NONE : does not exist
// UTF_8_ENCODING : for utf_8 enoding found
// UTF_16_ENCODING : for utf_16 encoding found
// UTF_32_ENCODING : for utf_32 encoding found
int check_encoding(int fd)
{
char *buf;
off_t fsize;
fsize = lseek(fd, 0L, SEEK_END);
if (fsize < 2)
return ERROR;
buf = (char*)malloc(2 * sizeof(char));
lseek(fd, 0L, SEEK_SET);
read(fd, buf, 2);
if (!strncmp(buf, UTF_16_BE, 2) ||
!strncmp(buf, UTF_16_LE, 2))
{
free(buf);
return UTF_16_ENCODING;
}
if (fsize >= 3)
{
realloc(buf, 3);
if (!strncmp(buf, UTF_8, 3))
{
free(buf);
return UTF_8_ENCODING;
}
}
if (fsize >= 4)
{
realloc(buf, 4);
if (!strncmp(buf, UTF_32_BE, 4) ||
!strncmp(buf, UTF_32_LE, 4))
{
free(buf);
return UTF_32_ENCODING;
}
}
free(buf);
return FALSE;
}