アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語を初めてかなり長い年月が経っておりますが、
「ファイルから読み込んだワイド文字を表示できない」という
初歩的な問題に悩んでおります。
以下にソースを載せてありますので、誤りを教えて頂けると
大変嬉しいです。

処理内容は、
(1) Test.txt へ文字"ABC"を出力
(2) Test.txtから文字列を読み込み表示
です。

============================================
#include <stdio.h>
#include <locale.h>

void main()
{
FILE *pFileOut = NULL;
FILE *pFileIn = NULL;

::_wsetlocale(LC_ALL, L"");

if(::_wfopen_s(&pFileOut, L"Test.txt", L"w,ccs=UTF-16LE") == 0)
{
::fwprintf(pFileOut, L"%s", L"ABC");
::fclose(pFileOut);
}

if(::_wfopen_s(&pFileIn, L"Test.txt", L"r") == 0)
{
unsigned char cBOM[2];
wchar_t szString[100];

cBOM[0] = ::fgetc(pFileIn);
cBOM[1] = ::fgetc(pFileIn);
printf("%02x%02x\n", cBOM[0], cBOM[1]);

::fwscanf(pFileIn, L"%s", szString);
::wprintf(L"[%s]\n", szString);

::fclose(pFileIn);
}
}
============================================

ちなみに、作成されたファイルのバイナリは以下の通りになっております。
ff fe 41 00 42 00 43 00

また、実行結果は以下の通りになっております。
fffe
[A]

以上よろしくお願い致します。

A 回答 (4件)

理由はわからんが %S.

    • good
    • 0
この回答へのお礼

回答有難うございます。

早速、%S に変更し実行してみました。
いろいろ実行してみた結果、

【結果】
::fwscanf(pFileIn, L"%s", szString);

::fwscanf(pFileIn, L"%S", szString);
に変更するのみで、[ABC]が正しく表示されました。
(wprintf()は変更せず、%sを指定)

有難うございました。
でも、なぜ fwscanf() だけ %S にする必要があるのか、疑問は残りますが。。

お礼日時:2012/12/13 11:09

忘れてたけど、printfも「wchar_t型の文字列を指定する場合は、%lsを使う」ので注意。



::fwscanf(pFileIn, L"%s", szString);
::wprintf(L"[%s]\n", szString);

の2行を

::fwscanf(pFileIn, L"%ls", szString);
::wprintf(L"[%ls]\n", szString);

に直せばオッケーです。

printfの方が%sのままだったら、折角正しく読み込めても、charの文字列だと思われて、ちゃんと表示されません。
    • good
    • 0
この回答へのお礼

早速の回答有難うございます。

ご指摘通り、%s を %ls へ変更して実行しましたが、結果は以下の通り同じでした。
fffe
[A]

私は、以下の様に表示されるのを期待しているのですが間違っているのでしょうか?
fffe
[ABC]

補足として、開発環境は以下の通りです。
Windows7/64bit - Visual Studio 2010 Professional.

お礼日時:2012/12/12 17:05

行をコピペして書き直すの忘れた(本日2回目)




char szWString[100];


wchar_t szWString[100];
    • good
    • 0

>wchar_t szString[100];


>::fwscanf(pFileIn, L"%s", szString);

wscanfは、wchar_t型の文字配列に文字列を読み込む場合は、%sではなく%lsを使う。

char szCString[100];
char szWString[100];
:fwscanf(pFileIn, L"%s", szCString);
:fwscanf(pFileIn, L"%ls", szWString);

上記のように、書式指定子にlがあるかないかで、格納先の配列の型が異なるので注意。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!