何が原因なのでしょうか?
教えてください。お願いします。
//****************************//
//* インクルードファイル *//
//****************************//
#include "player.h"
#include "data.h"
#include <stdio.h>
//**********************//
//* コンストラクタ *//
//**********************//
CData::CData ()
{
m_pPlayer = NULL;
m_nNumPlayer = 0;
}
//********************//
//* デストラクタ *//
//********************//
CData::~CData ()
{
}
//********************//
//* 選択処理関数 *//
//********************//
void CData::SelectMode ( void )
{
MODE mode;
do
{
// 番号入力
printf ( "\nMENU\n" );
printf ( "以下の番号から処理を選んでください\n" );
printf ( "1. 入力\n" );
printf ( "2. 出力\n" );
printf ( "3. セーブ\n" );
printf ( "4. ロード\n" );
printf ( "0. 終了\n" );
printf ( "> " );
scanf ( "%d" , &mode );
printf ( "\n" );
// 各番号の処理
switch ( mode )
{
// 終了処理
case MODE_FINISH:
printf ( "プログラムを終了します\n" );
break;
// 入力処理
case MODE_INPUT:
Input ();
break;
// 出力処理
case MODE_OUTPUT:
Output ();
break;
// セーブ処理
case MODE_SAVE:
Save ();
break;
// ロード処理
case MODE_LOAD:
Load ();
break;
}
}while ( mode != MODE_FINISH ); // 終了処理が呼ばれるまでループ
}
//******************//
//* 初期化関数 *//
//******************//
void CData::Init ( void )
{
// メモリ解放
if ( m_pPlayer != NULL )
{
delete[] m_pPlayer;
m_pPlayer = NULL;
}
}
//****************//
//* 終了関数 *//
//****************//
void CData::Uninit ( void )
{
// メモリ解放
if ( m_pPlayer != NULL )
{
// 人数分終了処理
for ( int i = 0; i < m_nNumPlayer; i++ )
{
m_pPlayer[i].Uninit();
}
delete[] m_pPlayer;
m_pPlayer = NULL;
}
}
//****************//
//* 入力関数 *//
//****************//
void CData::Input ( void )
{
// 入力人数指定
do
{
printf ( "何人分のデータを入力しますか?(%d~%d人まで) > " , MIN_NUM , MAX_NUM );
scanf ( "%d" , &m_nNumPlayer );
}while ( m_nNumPlayer < MIN_NUM | m_nNumPlayer > MAX_NUM );
// メモリ解放
if ( m_pPlayer != NULL )
{
delete[] m_pPlayer;
m_pPlayer = NULL;
}
// 動的メモリ確保
m_pPlayer = new CPlayer [m_nNumPlayer];
// 人数分初期化
for ( int i = 0; i < m_nNumPlayer; i++ )
{
m_pPlayer[i].Init();
}
// 入力人数分ループ
for ( int i = 0; i < m_nNumPlayer; i++ )
{
printf ( "\n~ %d人目のデータ ~\n" , i + 1 );
// プレイヤー入力処理
m_pPlayer[i].Input();
}
}
//****************//
//* 出力関数 *//
//****************//
void CData::Output ( void )
{
if ( m_nNumPlayer == 0 )
{
printf ( "データがありません\n" );
}
// 入力人数分ループ
for ( int i = 0; i < m_nNumPlayer; i++ )
{
printf ( "\n~ %d人目のデータ ~\n" , i + 1 );
// プレイヤー出力処理
m_pPlayer[i].Output ();
}
}
//******************//
//* セーブ関数 *//
//******************//
void CData::Save ( void )
{
FILE* fp;
int nData;
// 入力人数が範囲外なら
if ( m_nNumPlayer < MIN_NUM || m_nNumPlayer > MAX_NUM )
{
printf ( "データがありません\n" );
return;
}
else
{
// ファイルを開く
fp = fopen ( "savedata.bin" , "wb" );
// ファイルが開けなかったら
if ( fp == NULL )
{
printf ( "FILE OPEN ERROR\n" );
return;
}
else
{
// ファイルへ書き込み
fwrite ( &m_nNumPlayer , sizeof ( int ) , 1 , fp );
for ( int i = 0; i < m_nNumPlayer; i++ )
{
// プレイヤーのライフ保持
nData = m_pPlayer[i].GetLife ();
fwrite ( &nData , 4 , 1 , fp );
// プレイヤーの攻撃力保持
nData = m_pPlayer[i].GetAttack ();
fwrite ( &nData , 4 , 1 , fp );
// プレイヤーのスピード保持
nData = m_pPlayer[i].GetSpeed ();
fwrite ( &nData , 4 , 1 , fp );
}
printf ( "セーブしました\n" );
// ファイルを閉じる
fclose ( fp );
}
}
}
//******************//
//* ロード関数 *//
//******************//
void CData::Load ()
{
int nData;
FILE* fp;
// ファイルを開く
fp = fopen ( "savedata.bin", "rb" );
// ファイルを開けなかったら
if ( fp == NULL )
{
printf ( "FILE OPEN ERROR\n" );
return;
}
else
{
// 人数読み込み
fread ( &m_nNumPlayer , sizeof (int) , 1 , fp );
// メモリ解放
if ( m_pPlayer != NULL )
{
delete[] m_pPlayer;
m_pPlayer = NULL;
}
// 動的メモリ確保
m_pPlayer = new CPlayer [m_nNumPlayer];
// 人数分初期化
for ( int i = 0; i < m_nNumPlayer; i++ )
{
m_pPlayer[i].Init();
}
// 人数が0でないなら
if ( m_nNumPlayer >= MIN_NUM && m_nNumPlayer <= MAX_NUM )
{
for ( int i = 0; i < m_nNumPlayer; i++ )
{
// プレイヤーのライフ取得
fread ( &nData , 4 , 1 , fp );
m_pPlayer[i].SetLife ( nData );
// プレイヤーの攻撃力取得
fread ( &nData , 4 , 1 , fp );
m_pPlayer[i].SetAttack ( nData );
// プレイヤーのスピード取得
fread ( &nData , 4 , 1 , fp );
m_pPlayer[i].SetSpeed ( nData );
}
printf ( "ロードしました\n" );
// ファイルを閉じる
fclose ( fp );
}
// 人数が0だったら
else
{
printf ( "データがありません\n" );
}
}
}
/////////////// EOF ///////////////
[hr]
/*****************************/
/* */
/* データヘッダ [data.h] */
/* */
/*****************************/
#ifndef _DATA_H_
#define _DATA_H_
#define MIN_NUM ( 1 )
#define MAX_NUM ( 3 )
/********************/
/* 構造体の定義 */
/********************/
class CPlayer;
class CData
{
public:
typedef enum
{
MODE_FINISH = 0 , // 終了
MODE_INPUT , // 入力
MODE_OUTPUT , // 出力
MODE_SAVE , // セーブ
MODE_LOAD , // ロード
MODE_MAX , // 最大数
}MODE;
CData (); // コンストラクタ
~CData (); // デストラクタ
void Init ( void ); // 初期化処理
void Uninit ( void ); // 終了処理
void SelectMode ( void );
private:
void Input ( void ); // 入力処理
void Output ( void ); // 出力処理
void Save ( void ); // セーブ処理
void Load ( void ); // ロード処理
CPlayer* m_pPlayer;
int m_nNumPlayer; // プレイヤーの数
};
#endif
/////////////// EOF ///////////////