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

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

ただいまの
回答率

88.92%

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

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 4,665

m24yama

score 26

いつもお世話になっております。
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"のインスタンスが引数リストと一致しません

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 15:31

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

    キャンセル

  • 2017/05/25 15:55

    maisumakun 様
    回答ありがとうございます。
    下記のようにソースを修正してみたのですが、最初のCStringの部分で
    赤波線になり、エラーなります。

    CString strFile;
    CFile file;
    if (file.Open((strFile), CFile::modeWrite | CFile::typeText)){

    ERROR:"CString" があいまいです。


    また、file.Openの「.」の部分が赤波線も相変わらずです。

    キャンセル

  • 2017/05/25 16:09

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 15:52

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

    キャンセル

0

    CString strFile;
    CFile file;
    if (file.Open((strFile), CFile::modeWrite | CFile::typeText)){
        return;
    }

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

元のコードの場合でも

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


とする方法あります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 16:39

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

    キャンセル

  • 2017/05/25 17:57

    これは、新しいプロジェクトに作り直すという最終手段が見えてきたかもしれません

    まず、ここの部分を新しいプロジェクトに記述して同様のことが起きるか確認してください
    問題なければ、ヘッダで何が足りないか確認していきましょう

    ダメならば、新しく作り直しですかね

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 16:26

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

    キャンセル

  • 2017/05/25 16:28

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

    キャンセル

  • 2017/05/25 17:44

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/25 17:38

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

    キャンセル

  • 2017/05/25 17:58 編集

    質問文をよく見ると

    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
    に出ているサンプルのとおりにやってもダメなのですか?

    キャンセル

check解決した方法

-2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 14:06

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

    キャンセル

  • 2017/05/26 14:13

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

    キャンセル

  • 2017/05/26 14:55

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る