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

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

ただいまの
回答率

88.80%

C++/CLI FILE *fpの扱い方

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,977

hsgru3

score 22

前提・実現したいこと

C++/CLIでWindowsフォームアプリケーションの作成をしています。
comboboxで指定した値をsavedata.datに保存して、プログラムを再起動したさいその値を呼び出すようなプログラムを作りました。
Releaseモードで作成した実行可能ファイルを実行すると問題なくプログラムが動くのですが、デバッグの開始をすると

ハンドルされない例外が 0x00007FFC0C99CA78 (ucrtbase.dll) で発生しました(USPx64_3.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。


と表示されます。
イメージ説明

fopen``fread``fcloseの使い方が間違っているのかと思いますが解決策がわかりません。
何か解決策、アドバイスがあれば教えていただきたいです。

該当のソースコード

#include <iostream>
#include <time.h>
#include <fstream>
#include <vector>
#include "yolo_v2_class.hpp"
#include "opencv2\opencv.hpp"
#include "pxcsensemanager.h"
#include "PXCProjection.h"
#include "aufd_v.1.3.h"

using namespace cv;
using namespace std;

//カラー画像(処理用、保存用)
Mat src, dst;

//座標変換インスタンス
PXCProjection *projection = nullptr;
const PXCCapture::Sample *sample;
PXCSenseManager *senseManager = 0;

//デプス画像の距離情報格納バッファ
vector<unsigned short> depthBuffer;

//カラー画像の幅、高さ、解像度
const int COLOR_WIDTH = 640;
const int COLOR_HEIGHT = 480;
const int COLOR_FPS = 30;

~~~~省略~~~~~

//物体検出オブジェクトの作成
Detector detector("yolov2-obj.cfg", "yolov2-obj_23000.weights");



namespace UI {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// USP の概要
    /// </summary>

~~~~~~省略~~~~~~~

#pragma endregion
             //初期化
    private: System::Void USP_Load(System::Object^  sender, System::EventArgs^  e) {

        // SenseManagerを生成する
        senseManager = PXCSenseManager::CreateInstance();
        if (senseManager == 0) {
            throw std::runtime_error("SenseManagerの生成に失敗しました");
        }

~~~~~~~~~省略~~~~

        //タイマーの初期化
        timer1->Interval = 33;
        timer1->Enabled = true;

        //設定値の呼び出し
        FILE *fp;
        SaveData Data;
        fp = fopen("savedata.dat", "rb");
        fread(&Data, sizeof(Data), 1, fp);
        fclose(fp);
        Frequency = Data.F;
        Time = Data.T;
        comboBox1->SelectedIndex = Frequency/10;
        comboBox2->SelectedIndex = Time - 1;
    }

             //実行
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {

        //描画
        captureImage();

        //設定値の反映
        Int32::TryParse(comboBox1->SelectedItem->ToString(), Frequency);
        Int32::TryParse(comboBox2->SelectedItem->ToString(), Time);
     }

~~~~~~~省略~~~~~~~~

             //設定値の保存
    private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {

        FILE *fp;
        SaveData Data = { Frequency, Time };
        fp = fopen("savedata.dat", "wb");
        fwrite(&Data, sizeof(Data), 1, fp);
        fclose(fp);
        cout << "設定値保存" << endl;
    }
};
}

素人の質問で申し訳ありませんがよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2019/05/21 21:42

    SaveData を保存してますが、これは何でしようか?
    fread/fwriteは、バイト列を対象としてるので、その辺でも問題が起きてませんか?
    また、デバッグ実行でエラーとの事ですが、Breakを 気になる場所に置いて、ステップ実行するとどうしでょうか?

    キャンセル

  • hsgru3

    2019/05/21 21:53

    struct SaveData {
    int F, T;
    };
    2つの変数Frequency,Timeを保存するための構造体です。
    わかりずらくて申し訳ありません!

    キャンセル

  • pepperleaf

    2019/05/21 22:07

    単純な struct なんで問題なさそうですが、 C++/CLIがちょっと気になります。 デバッグ実行が該当箇所で止める事ができないのでしょうか?

    キャンセル

  • dodox86

    2019/05/21 23:30

    fopenが失敗したまま続行しているのでは?エラー(NULL)が返ってきているか確認してみてください。"savedata.dat"をC:\\data\\savedata.dat"などと正しいPATHを確実に指定してみてはどうでしょうか。

    キャンセル

回答 1

checkベストアンサー

+1

        fp = fopen("savedata.dat", "rb");
        fread(&Data, sizeof(Data), 1, fp);

ファイルが開けなかった可能性を考慮していないのが問題です。
freadでブレークしてfpNULLになっていないか確認するとよいでしょう。

特にwindowsの場合はカレントディレクトリが起動の方法で変わることがあります。
カレントディレクトリがどこになっているかチェックするとよいでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/22 10:20

    回答ありがとうございます!
    fopenの後に
    if (fp == NULL) {
    return;
    }
    とすることでデバッグできました。
    ありがとうございます!

    キャンセル

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

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

関連した質問

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