質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

9470閲覧

C++ MFC ファイルのオープンでエラーになってしまいます。

m24yama

総合スコア38

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/25 06:23

いつもお世話になっております。
Visual Studio 2013 C++ MFC でコーディングをしていますが、
ファイルのオープンができず、悩んでおります。
下記のようにコーディングしているのですが、
file.Openの「.」の部分が赤波線になり、下記のようなエラーになってしまいます。何か解決方法がございましたら、是非とも教えて頂けますでしょうか。よろしくお願い致します。

std::string strFile;
strFile = g_strLogPath + g_strLogName;
CFile file;
if (file.Open((strFile), CFile::modeWrite || CFile::typeText)){


オーバーロードされた関数"CFile::Open"のインスタンスが引数リストと一致しません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

自己解決

皆様、色々と何度も丁寧な回答をして頂きまして、本当に感謝しております。

皆様の回答を参考にして、以下のようにダメ元で記述をしてみたところ、
エラーが解消されました。
if (file.Open(LPCTSTR(strFile.c_str()), CFile::modeWrite | CFile::typeText)){

なぜ、LPCTSTRを入れただけでエラーが解消されたのかは、自分はよくわからないのですが、納期が迫っておりますので、次に進みたいと思います。

本当に、ありがとうございました。
感激しております。

投稿2017/05/25 09:18

m24yama

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ardin

2017/05/25 09:31

キャストして明示的に型が決まったのがエラー解消の理由なのでしょうが、 他の方法でダメな理由が分からない。プロジェクトの設定でこういうことになっているのかな
m24yama

2017/05/25 09:37

ardin 様 設定についても、詳細まで確認はしたのですが、どこがおかしいかは不明でした。本当にありがとうございます。
can110

2017/05/25 11:53

プロジェクトの文字セットは確認されましたか(何でしたか)? エラーは出なくなったかもしれませんが、おそらく正常には動作しないと思います。
m24yama

2017/05/26 02:06

can110 様 プロジェクトの文字セットは、Unicode でした。
can110

2017/05/26 04:24

なるほど。了解です。その場合、LPCTSTR = LPWSTR = const WCHAR* 型を求められています。 強引にLPCTSTRでキャストしビルドエラーは出なくなったかもしれませんが、正常に動作しません。 すなわち解決していないと思いますが、どうお考えでしょうか?
m24yama

2017/05/26 05:06

can110 様 ご指摘ありがとうございます。 何せ初心者ですので、他のエラーの対応に追われています。 今のところ、良い考えは自分にはございません。 逆に、どのようにしたらよいのでしょうか?
can110

2017/05/26 05:13

具体的な修正方法は他の方がいくつか回答されているので、それらのいずれかを採用してはいかがでしょうか? 少なくともこの回答を採用してはダメなので。
m24yama

2017/05/26 05:55

can110 様 アドバイスありがとうございます。 よく検討してみます。 感謝いたします。
guest

0

外していたらすいません。

コンパイルはUnicode形式ですか?それともマルチバイト形式?
もしUnicode形式でコンパイルしているのならstd:wstringを使わないといけないと思います。openに渡す時は.c_str()が必要なはずです。

もしくは、マルチバイト形式に変えるかですが、MFCのマルチバイト形式のライブラリはVS2013では標準ではついてなくて、別途Microsoftからダウンロード(無料)してインストールが必要だったような気がします。

投稿2017/05/25 08:20

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m24yama

2017/05/25 08:38

PineMatsu 様 回答ありがとうございます。 Unicode形式でコンパイルしておりますので、 std:wstringと.c_str()を使用してみましたが、変わりませんでした。 ちなみに、マルチバイト形式にも変えてみましたが、 残念ながら、変わりませんでした。 ご丁寧にありがとうございます。 引き続き、参考書とネットの検索をして解決できればと思います。 感謝いたします。
PineMatsu

2017/05/25 09:01 編集

質問文をよく見ると if (file.Open((strFile), CFile::modeWrite || CFile::typeText)){ となってますが、 正しくは if (file.Open((strFile), CFile::modeWrite | CFile::typeText)){ と「|」は1本でないと2番めの引数はbool型に変換されてしまいます。それで引数の型が合わないと出ているんだと思います。 ・・と書いたところで他の方スレを見るとこれも確かめたとのこと。 う~む、Microsoftの https://msdn.microsoft.com/ja-jp/library/hwbccf8z.aspx に出ているサンプルのとおりにやってもダメなのですか?
guest

0

strFile.c_str()で定数文字列が取り出せないかな?

投稿2017/05/25 07:23

kopio

総合スコア487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kopio

2017/05/25 07:26

1行のコメント書いている間に、大量の回答が付いて悲しい状態に・・・
m24yama

2017/05/25 07:28

kopio 様 strFile.c_str()は、昨日から何度か試しているのですが、 エラーは解消されませんでした。 回答ありがとうございます。 感謝いたします。
kopio

2017/05/25 08:44

std::string を std::basic_string<TCHAR>に変えたらどうでしょうか?
guest

0

MFC

1 CString strFile; 2 CFile file; 3 if (file.Open((strFile), CFile::modeWrite | CFile::typeText)){ 4 return; 5 } 6

最初に貼られたコードについてはお二方が答えて言うことはないので、新しく書かれている方について
同様にVS2013C++の環境でコピペしてみたけれども、特に警告の赤印は出ないですね。
ビルドしても同様のエラーでしょうか

元のコードの場合でも

C++,MFC

1 std::string strFile; 2 strFile = g_strLogPath + g_strLogName; 3 CFile file; 4 if (file.Open(strFile.c_str(), CFile::modeWrite | CFile::typeText)){ 5

とする方法あります

投稿2017/05/25 07:20

ardin

総合スコア546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m24yama

2017/05/25 07:39

ardin 様 ビルドしても変わりませんでした。 また、記述をして頂きました、 if (file.Open(strFile.c_str(), CFile::modeWrite | CFile::typeText)){ につきましたも、試してみましたが、変わらずです。 #include に何か足りないのでしょうか。 回答を頂きまして、ありがとうございます。 何とか解決したいのですが、今のところ方法が見当たりません。
ardin

2017/05/25 08:57

これは、新しいプロジェクトに作り直すという最終手段が見えてきたかもしれません まず、ここの部分を新しいプロジェクトに記述して同様のことが起きるか確認してください 問題なければ、ヘッダで何が足りないか確認していきましょう ダメならば、新しく作り直しですかね
guest

0

CFile::Openより、引数の型が合ってません。
strFile.c_str()でエラー解消するかもしれませんが、プロジェクトの文字セットによります。
プロジェクトの文字セットについては_T("")マクロについてを参照ください。

以下、本質問と直接関係ありませんが、アドバイスです。

  • MFCであれば特別な理由のないかぎりstd::stringではなくCStringを使うことをお勧めします。
  • 2番目の引数CFile::modeWrite || CFile::typeTextは意図した動作をしませんCFile::modeWrite | CFile::typeTextに修正すべきます。

投稿2017/05/25 06:39

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m24yama

2017/05/25 06:52

can110 様 早々の回答ありがとうございます。 また、アドバイスありがとうございます。 参考にさせて頂きます。
guest

0

MSDNにありますように、CFile::Openの第1引数はLPCTSTRを取ります。

std::stringは自動でLPCTSTRに変換できませんので、MFCのCStringを使いましょう。

投稿2017/05/25 06:29

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/05/25 06:31

あと、フラグを組み合わせる場合の演算子は、「|」(1本だけ)が正しいです。
m24yama

2017/05/25 06:55

maisumakun 様 回答ありがとうございます。 下記のようにソースを修正してみたのですが、最初のCStringの部分で 赤波線になり、エラーなります。 CString strFile; CFile file; if (file.Open((strFile), CFile::modeWrite | CFile::typeText)){ ERROR:"CString" があいまいです。 また、file.Openの「.」の部分が赤波線も相変わらずです。
m24yama

2017/05/25 07:09

追記です。 #include <atlstr.h>をコメントにしましたら、 ERROR:"CString" があいまいです。は消えましたが、 file.Openの「.」の部分が赤波線は、そのままです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問