- ベストアンサー
VS2010 VC++でバイナリデータをOpenできないエラーの解決方法
- VS2010のVC++でバイナリデータをOpenする際、CFile::Openの引数リストが一致しないというエラーが発生します。このエラーの解決方法について解説します。
- VC++でバイナリデータをOpenするためには、CFile::Openの第二引数にCFile::modeReadとCFile::typeBinaryを指定する必要があります。しかし、引数の指定方法が間違っているためにエラーが発生しています。
- 正しい引数の指定方法は、CFile::Openの第二引数にCFile::modeRead | CFile::typeBinaryを指定することです。このように指定することで、バイナリモードでファイルを読み込むことができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
CFile fr; CFileException e; wchar_t* pFileName = L"Kaltr.bat"; if(!fr.Open( pFileName, CFile::modeRead | CFile::typeBinary, &e)){ } 上記記述で、コンパイルできました。 frのピリオドで問題が出るなら、CFileがクラスとして認識されていないんじゃないでしょうか。 一度、MFCアプリケーションで新しいプロジェクトを作成して、コンパイルが通るか試してみては? なお、CFile::typeBinaryは「派生クラスで使用する」となっていて、CFileでは意味がないはずです。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
No4.のつづきです。。。 他の方も書かれていますが、 ファイルパスの指定文字列を、ワイド文字に する必要があるのではないですか? VC2003以降では、デフォルトでUNICODEが定義され、 LPCSTRなどのマクロはワイド文字用となります。 たとえば。 LPCTSTR = lpFileName = TEXT("Kaltr.bat"); fr.Open( lpFileName, CFile::modeRead, &e);
お礼
回答ありがとうございます。 参考にさせて頂きます。 大変たすかりました。ありがとうございます。
- aris-wiz
- ベストアンサー率38% (96/252)
CFileとは何者ですか?独自に作ったクラスでしょうか?それともMFC? MFCであれば、typeBinaryなんて値は存差しません。 仕様を見ないまま、勝手につけてはいけません。 #確かにありそうな名前ですが。。。 MFC前提で話を進めるならば、 CFileはもともと、バイナリ用のファイルIOクラスです。 テキストを扱う為には、CStdioFileクラスを使用します。 故に、ファイルタイプを指定する必要はありません。 MFCでないのなら、CFileが何者であるかを補足してください。
お礼
回答ありがとうございます。 自分で作ったクラスではありません。vb6を元に作成しているので、分からなかったのですが、TypeBinaryはおっしゃるとおりありませんでしたW ちなみに現在作成しているのは、win32でdll化したプロジェクトです。 VBからVC++(dll)を呼んで処理をする所です。 大変助かりました。ありがとうございます。
- php504
- ベストアンサー率42% (926/2160)
2010から仕様が変わったみたいですね virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM, CFileException* pError = NULL ); これが原因では
お礼
回答ありがとうございます。 仕様が変更されていて、解りづらくなっていたようなぁ・・・とても助かりました。 参考にさせて頂きます。
- m-take0220
- ベストアンサー率60% (477/782)
プロジェクトの設定でUNICODEを使用するようになっているなら、ファイル名はchar*ではなくwchar_t*になります。その点で引数リストと一致しないのではないでしょうか。 wchar_t* pFileName = L"Kaltr.bat"; でどうでしょうか。 この差を吸収するため、VC++ではLPCTSTR、LPTSTR、TEXTマクロ、_Tマクロなどが用意されていますので、一度調べてみてはいかがでしょうか。
お礼
回答ありがとうございます。 さっそく試してみましたが、同じようなエラーでした。 if(!fr.Open( pFileName, CFile::modeRead | CFile::typeBinary, &e)){ エラーの箇所が"!fr.Open"のピリオドの部分と"&e)"の括弧部分がエラーとなっているようです。 調べてみます。ありがとうございました。
お礼
回答ありがとうございます。 CFileException e;指定が変換出来ないというエラーが出ていました。 if(!fr.Open( pFileName, CFile::modeRead | CFile::typeBinary, Null)){のように修正したらコンパイルが出来たので、先に進んでみようと思います。 大変助かりました。ありがとうございます。