0


次のように、C で fwscanf() を使用して Shift-JIS エンコーディングのテキスト ファイルを読み込もうとしています。

_locale_t JapaneseLocale=_create_locale(LC_ALL, "ja_JP");
FILE *inoto,*outoto;
double oto[LineCount][5];
int CurrentReading=0
wchar_t Filename[LineCount][MAX_PATH];
wchar_t Alias[LineCount][MAX_PATH];
setlocale(LC_ALL,"ja_JP");
inoto=_wfopen(L"oto.ini",L"r");
while(fwscanf(inoto,L"%S.wav=%[^L','],%lf,%lf,%lf,%lf,%lf%*C",&Filename[CurrentReading][0],&Alias[CurrentReading][0],&oto[CurrentReading][0],&oto[CurrentReading][1],&oto[CurrentReading][2],&oto[CurrentReading][3],&oto[CurrentReading][4])==7) 
++CurrentReading;
fclose(inoto);

ファイル内の各行の形式は次のようになります:
_あ_い_う_え_お.wav=- あB2,568.613,375.0,-583.333,250.0,83.333
配列は正しい長さで生成され、エラーは発生しませんでしたコンパイル中または実行中に、配列は操作後も空のままでした。
ただし、このコード ブロックを使用して、ファイル内の行数を正しく決定することができました。

wchar_t tempchar;
int LineCount=0;
while(tempchar!=WEOF)
{
tempchar=fgetwc(inoto);
if(tempchar==L'\n') ++LineCount;
}

%[^L','] がワイド文字で正しく処理できるかどうかもわかりません。私のコンパイラは Windows 10 の Mingw-w64
です。

編集:修正と提案をしてくれたJonathan Lefflerとphuclvに感謝します!この問題を深く掘り下げたところSetConsoleOutputCP、windows.h で使用されているワイド文字や、ASCII 入力/出力用の同じ関数をエラーなしで使用することなく、それを行うことができることがわかりました。重要なことの 1 つは、Windows の Shift-JIS の正しいロケールは「Japanese_Japan.932」です。それでも、この関数は Windows 固有であることを知っているので、C 標準関数のみを使用して、Linux などの他のプラットフォームで同じ機能を実装する方法を知りたいと考えています。printf系の関数は、グローバルなロケール設定に関係なく、出力文字列をUTF-8として扱っているようです。

4

0 に答える 0