dポイントプレゼントキャンペーン実施中!

VC++(VisualStudio2005)にてCString型のフルパスをfopenしたいと思っています。

他ページでは
char *name = new char[filepass.GetLength()+1];
strcpy( name, filepass );
でstrcpyでCstring→charへ変換できるとあったのですが、
'strcpy' : 2 番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
というエラーをはいて実行できませんでした。

lstrcpy(name, filepass)でも
1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
となりました。

何か良い方法をご存じないですか?
char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。

A 回答 (3件)

CStringはTCHARベースで文字列を持ちます。


よって、CStringからキャストして取得できるのはLPCTSTR型の値、
GetBuffer(SetLenght)メソッドで取得できるのはLPTSTR型の値です。

ここで、TCHARはコンパイルオプションによって、
char型あるいはwchar_t型になります。

VC++2005以降ではデフォルトでwchar_tになるようになっています。

つまり LPCTSTR型 は LPCWSTR型に、 LPTSTR型 は LPWSTR型 になります。

ここで、fopen関数は const char* 型 つまり LPCSTR型 を引数に取ります。
よって、CStringの変数を指定しても、LPCSTR型の値を取得することができないためコンパイルエラーになります。

解決方法としては、

a. const char*型を欲するfopen関数ではなく、const TCHAR*型を欲する _tfopen関数を使う。
b. コンパイルオプションをTCHAR→charになるようにする。

のどちらかでしょう。
もっとも、MFCならCFile,CStdioFileあたりのクラスを使うほうが使い勝手が良いでしょうけど。
    • good
    • 0
この回答へのお礼

_tfopenを使用することで解決できました。
どうも、ありがとうございました。

お礼日時:2008/07/15 07:29

LPWSTRに関しては VC.NET2005から規定の文字コードセットが『Unicode』に変更されているので wchar_t型を使う方向に修正するか


もしくは プロジェクトの設定を『マルチバイト文字を使用する』に変更するかのいずれかです
プロジェクト > プロジェクトのプロパティで
構成プロパティ > 全般 > 文字セット で変更可能です

strcpy/_mbscpy/wcscpyにCString型をソースに使うのであれば GetBuffer/ReleaseBufferを使います

_tcscpy( name, (TCHAR*)filepass.GetBuffer() );
filepass.ReleaseBuffer();
といった具合にします

_tcscpyは strcpy,_mbscpyまたはwcscpyをプロジェクトの設定により吸収するためのマクロ定義です

MFCで行うなら CFileなどを使った方が型変換なども
    • good
    • 0
この回答へのお礼

こちらの方法でも出来ましたが、
ANo.3の方の_tfopneを使用したほうがすっきりしたので、そちらを使用させていただきました。

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

お礼日時:2008/07/15 07:32

>char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。



なぜ fopen() なのでしょうか?
CFile::Open() を使えばよいのではないでしょうか?

この回答への補足

自分もCFile::Open()を使うことは考えたのですが、
プログラム中に使用しているサンプルプログラムにfopen()が使用されており、
しかもそのプログラムが難しくて自分では改変できないため、fopen()で出来ればよいと思いました。

説明不足で申し訳ありませんでした。

補足日時:2008/07/15 07:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!