- - PR -
String の文字列を char の配列に変換する方法がわからない
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-15 14:19
VC++.net で String クラスのインスタンスに保存した文字列を char 型の文字列に変換する方法がわかりませんので教えてください。
目的は String のインスタンスに保存したディレクトリパスの文字列を SetCurrentDirectory() の引数にしてカレントディレクトリの設定を行いたいためです。 String::get_char()を行っても __wchar_t 型のマルチバイトコードが取得されてしまい、しかも、__wchar_t から char に変換できないため困っています。 どうか、よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2004-08-15 14:39
「どの」String クラスのことでしょう? STL の string でしょうか? それとも BCL の System.String でしょうか? 相手にするクラスが異なれば、適切な方法も異なってきます。
少なくとも、ATL の CW2T マクロや、WideCharToMultiByte() API で変換することもできます。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||
|
投稿日時: 2004-08-15 17:09
早速の回答ありがとうございます。
適切な回答かわかりませんが、 プロジェクトを作成したときのテンプレートは「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" | ||||||||||||||||
|
投稿日時: 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 17:39
ひどりさん、JITTA さん、ありがとうございました。
String から char には変換できないということで納得しました。 JITTA さんが言われた StreamWriter ・・・についての理解はありませんので、 現段階では「そういうものがある」というぐらいに覚えておきます。 本当にありがとうございました。 | ||||||||||||||||
|
投稿日時: 2004-08-15 17:44
すみません、回答が不十分でした。
SetCurrentDirectory() は Win32 の関数(だったと思いました)として扱っています。 Directory クラスのメンバー関数として存在するとは知りませんでした。 貴重な情報ありがとうございます。 ちなみに Directory クラスの存在を知ったのは、つい 2 時間ほどまえで、 Directory クラスに関しては、ちょうど、たった今調べているところでした。(汗) | ||||||||||||||||
|
投稿日時: 2004-08-15 23:16
ということは、Managed C++ で Windows フォームアプリケーションを作成されているということなので、「String クラス」は BCL の Sysytem.String クラスですね。 しかしまぁ、なんと難儀な選択をされたことでしょう。 個人的には、Managed C++ は Windows と .NET と C++ に関する深い知識と経験が必要だと思うので、ちょっと試してみて、なるべくなら深入りしないようにしようと心に決めました ;-p
最終目的が、「strDirectory に格納されたパスをカレントディレクトリにしたい」であるなら、
を使えばいいだけなので、String を char 配列に変換する必要はありません。 別な目的で String を char 配列に変換する場合には
などを用います。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||
|
投稿日時: 2004-08-16 18:35
同感。結構試してみて、「やってらんねぇ!」… |