C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: std::stringでファイル名が化ける


(過去ログ 52 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■28731 / inTopicNo.1)  std::stringでファイル名が化ける
  
□投稿者/ akt (9回)-(2008/11/29(Sat) 21:17:39)

分類:[C/C++] 

以下のコードを実行すると、ファイル名が「・.txt」のように化けてしまいます。

環境は
Windows XP
Visual C++ 2005
です。

プロジェクト設定は、Win32コンソールアプリケーションで、
文字セットは、Unicode、マルチバイト文字、両方試してみました。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	std::string str = "あ.txt";

	ofstream ofs;
	
	ofs.open(str.c_str());
	if (!ofs)
	{
		cerr << "Error" << endl;
	}

	return 0;
}

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

引用返信 編集キー/
■28735 / inTopicNo.2)  Re[1]: std::stringでファイル名が化ける
□投稿者/ akt (11回)-(2008/11/30(Sun) 00:42:28)
fopen()でファイルを作成すると文字化けしないことがわかりました。

結局、
・ostream open() 「あ.txt」というファイル名が文字化け
・fopen()     「い.txt」というファイル名を正常に作成できた
ということがわかりました。

この挙動の差は、なぜなのでしょうか?
ofstreamのopen()で全角ファイル名で文字化けしない方法が教えて頂けないでしょうか。


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

---以下ソースコード---
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	std::string str = "あ.txt";

	ofstream ofs;
	
	ofs.open(str.c_str());
	if (!ofs)
	{
		cerr << "Error" << endl;
	}
	
	str = "い.txt";
	
	FILE* fp = fopen(str.c_str(), "wb");
	if (fp == NULL)
	{
		cerr << "Error" << endl;
	}
	fclose(fp);

	return 0;
}

引用返信 編集キー/
■28738 / inTopicNo.3)  Re[1]: std::stringでファイル名が化ける
□投稿者/ επιστημη (1394回)-(2008/11/30(Sun) 02:07:51)
επιστημη さんの Web サイト
あらホント。なんででしょね、バグっぽいすね。
wide文字↓だとうまくいくっポいです。

std::wstring str = L"あ.txt";
ofstream ofs;
ofs.open(str.c_str());


引用返信 編集キー/
■28745 / inTopicNo.4)  Re[2]: std::stringでファイル名が化ける
□投稿者/ επιστημη (1395回)-(2008/11/30(Sun) 11:13:41)
επιστημη さんの Web サイト
> wide文字↓だとうまくいくっポいです。
>
> std::wstring str = L"あ.txt";
> ofstream ofs;
> ofs.open(str.c_str());

あるいは locale を設定すれば。

std::locale::global(std::locale("japanese"));
std::string str = "あ.txt";
ofstream ofs;
ofs.open(str.c_str());

雰囲気からするとopenに先立って与えられたファイル名をwide化
するんだけど、そのときに locale が与えられていないもんだから
化ける、ってことかしら。

引用返信 編集キー/
■28757 / inTopicNo.5)  Re[3]: std::stringでファイル名が化ける
□投稿者/ akt (12回)-(2008/11/30(Sun) 13:18:18)
No28745 (επιστημη さん) に返信
>>wide文字↓だとうまくいくっポいです。
>>
>>std::wstring str = L"あ.txt";
>>ofstream ofs;
>>ofs.open(str.c_str());
>
> あるいは locale を設定すれば。
>
> std::locale::global(std::locale("japanese"));
> std::string str = "あ.txt";
> ofstream ofs;
> ofs.open(str.c_str());
>
> 雰囲気からするとopenに先立って与えられたファイル名をwide化
> するんだけど、そのときに locale が与えられていないもんだから
> 化ける、ってことかしら。

無事、化けずに「あ.txt」を出力することができました。

日本語をfstreamで使う場合はlocale設定が必要なことがわかりました。

ありがとうございました。

解決済み
引用返信 編集キー/
■28759 / inTopicNo.6)  Re[4]: std::stringでファイル名が化ける
□投稿者/ Blue (1回)-(2008/11/30(Sun) 14:17:56)
参考
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=243152&SiteID=7
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -