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を使ってファイルオープンできれば良いです。
No.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あたりのクラスを使うほうが使い勝手が良いでしょうけど。
No.2
- 回答日時:
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などを使った方が型変換なども
こちらの方法でも出来ましたが、
ANo.3の方の_tfopneを使用したほうがすっきりしたので、そちらを使用させていただきました。
ご解答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
javascriptで文字列のsjis利用...
-
ダブルクォーテーションのrepla...
-
カタカナをローマジに変換する。
-
COBOLで半角カナを全角カナに変換
-
int型のゼロ埋め
-
phpでの文字コード変換について
-
JavaのStringクラスに「外字」...
-
byte配列をImageに変換する
-
javaの文字コード変換表はどこ...
-
【JAVA】CharをByteに変換したい。
-
javaで入力したの半角カタカナ...
-
javaの初歩的な質問です。
-
IE11においてのIME予測変換時の...
-
jspでString型からlong型への変換
-
VC++にてCString型のフルパスを...
-
電卓プログラムでかっこを対応...
-
javaで「全角が含まれているか...
-
substring バイト単位でやりたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
javascriptで文字列のsjis利用...
-
Visual Basic でのコードをASCI...
-
カタカナをローマジに変換する。
-
int型のゼロ埋め
-
C言語32bitから64bitの移行につ...
-
substring バイト単位でやりたい
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
-
Windows-31Jからutf-8への変換...
-
JavaのStringクラスに「外字」...
-
byte[] を long,float とかに...
-
IBM漢字コード⇒SJIS変換方法
-
エクセルVBAで「〜」が表現でき...
-
javaで「全角が含まれているか...
-
javaの初歩的な質問です。
-
クエリの結果とレコードセット...
-
[Javascript]エンターキー押下...
おすすめ情報