@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

String の文字列を char の配列に変換する方法がわからない

投稿者投稿内容
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-15 14:19
 VC++.net で String クラスのインスタンスに保存した文字列を char 型の文字列に変換する方法がわかりませんので教えてください。
 目的は String のインスタンスに保存したディレクトリパスの文字列を SetCurrentDirectory() の引数にしてカレントディレクトリの設定を行いたいためです。
 String::get_char()を行っても __wchar_t 型のマルチバイトコードが取得されてしまい、しかも、__wchar_t から char に変換できないため困っています。
どうか、よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-08-15 14:39
引用:

 VC++.net で String クラスのインスタンスに保存した文字列を char 型の文字列に変換する方法がわかりませんので教えてください。



「どの」String クラスのことでしょう?

STL の string でしょうか?
それとも BCL の System.String でしょうか?

相手にするクラスが異なれば、適切な方法も異なってきます。

引用:

__wchar_t から char に変換できないため困っています。



少なくとも、ATL の CW2T マクロや、WideCharToMultiByte() API で変換することもできます。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-15 17:09
早速の回答ありがとうございます。

引用:

渋木宏明(ひどり)さんの書き込み (2004-08-15 14:39) より:
引用:

 VC++.net で String クラスのインスタンスに保存した文字列を char 型の文字列に変換する方法がわかりませんので教えてください。



「どの」String クラスのことでしょう?

STL の string でしょうか?
それとも BCL の System.String でしょうか?

相手にするクラスが異なれば、適切な方法も異なってきます。



適切な回答かわかりませんが、
プロジェクトを作成したときのテンプレートは「Windows フォームアプリケーション(.NET)」としました。
・・・やはり回答になっているとは思えませんので、コードを添付します。
問題の String は下記コードの最後にあります。
以下のコードで、String の種類がわかるような適切な情報が入っているといいのですが、もしわからない場合は再度ご指摘をお願いします。

=============== Form1.h ==============

#include <stdio.h>
#include "MyLib.h"
#include "ListColumnCompare.h"

namespace ListPloration
{
・・・略・・・
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}

 ・・・略・・・

private:
System::Windows::Forms::ListView * listView1;

char* lpszPath;
private: String* strDirectory;        <== 問題の "String"
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-15 17:22
 .NET Frameworkでは、Unicodeで文字を扱います。このUnicodeは、1文字のバイト数が決まっていません。charは、1バイトと決まっています。このため、正しく“文字”を変換できないんですね。
 .NET Frameworkの中で扱うためには、Stringクラスでかまわないと思います。外部に持ち出すためにはcharに変換する必要があるかもしれませんが、適切なStreamWriterに、適切なエンコード処理を組み合わせれば、使えると思います。


 SetCurrentDirectoryというのが何を指すのかな?引数はStringですけど。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemiodirectoryclasssetcurrentdirectorytopic.asp

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-08-15 17:38 ]
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-15 17:39
ひどりさん、JITTA さん、ありがとうございました。

String から char には変換できないということで納得しました。
JITTA さんが言われた StreamWriter ・・・についての理解はありませんので、
現段階では「そういうものがある」というぐらいに覚えておきます。

本当にありがとうございました。
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-15 17:44
すみません、回答が不十分でした。

SetCurrentDirectory() は Win32 の関数(だったと思いました)として扱っています。
Directory クラスのメンバー関数として存在するとは知りませんでした。
貴重な情報ありがとうございます。

ちなみに Directory クラスの存在を知ったのは、つい 2 時間ほどまえで、
Directory クラスに関しては、ちょうど、たった今調べているところでした。(汗)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-08-15 23:16
引用:

プロジェクトを作成したときのテンプレートは「Windows フォームアプリケーション(.NET)」としました。



ということは、Managed C++ で Windows フォームアプリケーションを作成されているということなので、「String クラス」は BCL の Sysytem.String クラスですね。

しかしまぁ、なんと難儀な選択をされたことでしょう。
個人的には、Managed C++ は Windows と .NET と C++ に関する深い知識と経験が必要だと思うので、ちょっと試してみて、なるべくなら深入りしないようにしようと心に決めました ;-p

引用:

問題の String は下記コードの最後にあります。
(略)
char* lpszPath;
private: String* strDirectory;        <== 問題の "String"




最終目的が、「strDirectory に格納されたパスをカレントディレクトリにしたい」であるなら、
コード:
System.IO.Directory.SetCurrentDirectory()


を使えばいいだけなので、String を char 配列に変換する必要はありません。

別な目的で String を char 配列に変換する場合には
コード:
System.Text.Encoding.Default.GetChars()


などを用います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-16 18:35
引用:

渋木宏明(ひどり)さんの書き込み (2004-08-15 23:16) より:

しかしまぁ、なんと難儀な選択をされたことでしょう。
個人的には、Managed C++ は Windows と .NET と C++ に関する深い知識と経験が必要だと思うので、ちょっと試してみて、なるべくなら深入りしないようにしようと心に決めました ;-p


 同感。結構試してみて、「やってらんねぇ!」…

スキルアップ/キャリアアップ(JOB@IT)