VCについておしえてください。DLLを書いていてある関数はワイド文字を引数に受け取り、ファイルにマルチバイトで書き込む関数です。コンパイルはとおりますが実行時にエラーとなり、プログラムが落ちます。解決のためにdllではなく、普通のプログラムを書きましたが正しく文字セット変換が出来ません。wcstombsが-1を返してエラーになります。どうしてでしょうか?引渡しの文字列をL""でワイド文字とできるのでしょうか? コンパイルオプションはマルチバイト文字で設定しています。


#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>//setlocale( LC_CTYPE, "jpn" )のため


FILE *fpw1x;

int OutW(const wchar_t *str){
char strdummy[1000];
int i=wcstombs(strdummy,str,1000);
fputs(strdummy,fpw1x);

return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){

if ((fpw1x = fopen("C:\\TEST.TXT", "a")) == NULL) { }
wchar_t* str=L"あいうえお";
OutW(str);
fclose(fpw1x);
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/03/25 00:53:04
  • 終了:2012/03/26 00:09:08

回答(2件)

id:cx20 No.1

cx20回答回数603ベストアンサー獲得回数1072012/03/25 08:41:51

ポイント50pt

試しに、

//wchar_t* str=L"あいうえお";
wchar_t* str=L"abc";

と、してみてください。
正しく変換されているようであれば、日本語文字列の場合に変換に失敗している可能性があります。
その場合、以下のロケール指定が行われているか確認をお願いします。

setlocale( LC_CTYPE, "jpn" );

<参考情報>
■ C言語 ワイド文字列からマルチバイト文字列に変換 - stdlib.h - [ wcstombs ] | 勇躍のゴミ箱
http://simd.jugem.jp/?eid=122

id:SweetSmile1978 No.2

SweetSmile1978回答回数189ベストアンサー獲得回数292012/03/25 15:39:10

ポイント50pt

Visual C++ の場合、標準ランタイムでの日本語 lacale って
サポートされてましたっけ?

Windows API を使う方がいいのでは?

id:cx20

日本語 LOCALE に関して、ヘルプにも記載があるので、特段、問題ないと思っています。

setlocale( LC_CTYPE, "jpn" );

<参考情報>
■ 言語識別文字列 (CRT)
http://msdn.microsoft.com/ja-jp/library/39cwe7zf.aspx

setlocale が認識する言語識別文字列の一覧を次の表に示します。
オペレーティング システムがサポートしていない言語は setlocale で使用できません。
3 文字の言語文字列コードは Windows 2000 以降のオペレーティング システムでのみ有効です。

なお、setlocale() でロケール指定後、wcstombs() が機能することは、Windows7 + VC++2010 で確認しております。
他のバージョンで動作が異なるということでしたら、ご指摘願います。

2012/03/25 16:25:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません