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

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

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

受付中

人数設定処理ではちゃんと機能するが 、読み込み処理では同じnDateでも違う数字で返ってきてしまいます。原因と解決策を教えてください

Hosyu
Hosyu

総合スコア1

0回答

0評価

0クリップ

114閲覧

投稿2022/05/29 02:17

編集2022/06/08 06:41

#include <stdio.h>
#include <stdlib.h>
コード

//プロトタイプ宣言 void Title(void); //タイトル画面表示 void SaveData(int nData); //書き込み処理 void SelectData(void); //最初の画面表示 int LoadData(void); //読み込み処理 void InputData(int nData); //入力処理 void OutputData(int nData); //出力処理 int SetupData(void); //人数設定処理 //モード列挙型の定義 typedef enum { MODE_FINISH = 0, MODE_INPUT, MODE_OUTPUT, MODE_SAVE, MODE_LOAD, MODE_SETUP, MODE_MAX, }MODE; //モード列挙型 //マクロ変数宣言 #define BINARI_FILE "save.bin" //バイナリファイル #define DATA_MAX (5) //5を出力する #define DATA_ZERO (0) //0を出力する #define DATA_ONE (1) //1を出力する #define PLAYER_MAX (3) //プレイヤーの最大値 #define NAME_MAX (10) //名前の最大値 //プレイヤー構造体の定義 typedef struct { char aName[NAME_MAX]; //名前 int nAge; //年齢 float fHeight; //身長 }Player; //プレイヤーデータ //グローバル変数宣言 int g_aData[DATA_MAX]; Player g_aPlayer[PLAYER_MAX]; //================================================= //メイン関数 //================================================= void main(void) { SelectData(); //キー入力待ち printf("Enterキーを入力してプログラムを終了してください\n"); rewind(stdin); getchar(); } //================================================= //選択処理 //================================================= void SelectData(void) { int nSelData; int nData = 0 ; do { Title(); //タイトル scanf("%d", &nSelData); switch (nSelData) { case MODE_INPUT: //1を選択した場合 system("cls"); InputData(nData); //入力処理 break; case MODE_OUTPUT: //2を選択した場合 system("cls"); OutputData(nData); //出力処理 break; case MODE_SAVE: //3を選択した場合 system("cls"); SaveData(nData); //書き込み処理 break; case MODE_LOAD: //4を選択した場合 system("cls"); nData = LoadData(); //読み込み処理 break; case MODE_SETUP: //5を選択した場合 system("cls"); nData = SetupData(); //人数設定処理 system("cls"); break; case MODE_FINISH: //0を選択した場合 system("cls"); break; default: //それ以外の場合 system("cls"); printf("ちゃんと選択肢から選んでください\n\n"); break; } } while (nSelData != MODE_FINISH); } //================================================= //書き込み処理 //================================================= void SaveData(int nData) { FILE*pFile; if (g_aPlayer[DATA_ZERO].aName[DATA_ZERO] != NULL) {//名前のデータがある場合 //キー入力待ち printf("Now Saving....(Enterキーを押して進んでください)\n"); rewind(stdin); getchar(); pFile = fopen(BINARI_FILE, "wb"); fwrite(&nData, sizeof(int), DATA_ONE, pFile); fwrite(&g_aPlayer[DATA_ZERO], sizeof(Player), nData, pFile); fclose(pFile); //キー入力待ち printf("セーブが完了しました....(Enterキーで選択画面に戻ります)\n"); rewind(stdin); getchar(); system("cls"); } else {//名前のデータがなかった場合 printf("==================== エラー 402 NotFound =====================\n"); printf(" プレイヤーデータが入力されていません\n"); printf(" 選択画面で%dを選択してください(Enterキーで選択画面に戻ります)\n", MODE_INPUT); printf("===============================================================\n"); rewind(stdin); getchar(); system("cls"); } } //================================================= //読み込み処理 //================================================= int LoadData(void) { FILE*pFile; int nData; pFile = fopen(BINARI_FILE, "rb"); if (pFile != NULL) {//ファイルが開けた場合 fread(&nData, sizeof(int), DATA_ONE, pFile); //キー入力待ち printf("Now Loading....(Enterキーを押して進んでください)\n"); rewind(stdin); getchar(); fread(&nData, sizeof(int), DATA_ONE, pFile); fread(&g_aPlayer[DATA_ZERO], sizeof(Player), nData, pFile); //キー入力待ち printf("ロードが完了しました....(Enterキーで選択画面に戻ります)\n"); rewind(stdin); getchar(); system("cls"); fclose(pFile); } else {//開けなかった場合 printf("====================== エラー 403 NotFound =======================\n"); printf("ファイルを開くことができませんでした(Enterキーで選択画面にに戻ります)\n"); printf("===================================================================\n"); rewind(stdin); getchar(); system("cls"); } return nData; } //================================================= //設定処理 //================================================= int SetupData(void) { int nData; while (1) {//永久ループ printf("プレイヤー数を設定してください(%d~%d人まで設定できます)\n", DATA_ONE, PLAYER_MAX); scanf("%d", &nData); if (nData <= PLAYER_MAX && nData > DATA_ZERO) {//範囲内だった場合 return nData; break; } else if (nData > PLAYER_MAX) {//プレイヤーの最大値を超えた場合 printf("数が多すぎます\n"); printf("もう一度入力してください。\n"); } else if (nData < DATA_ZERO) {//0以下だった場合 printf("数が少なすぎます\n"); printf("もう一度入力してください。\n"); } } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

y_waiwai

2022/05/29 03:10

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
y_waiwai

2022/05/29 03:12

んで、どこがどういうふうに問題があるんでしょうか。 コードの説明もなしでは答えようありません
episteme

2022/05/29 04:58

SaveData()に問題があるのかも。コードが示されてないのでわからんが。
episteme

2022/05/29 06:13 編集

...main() もないな。 SetupData() から返ってきた nData が SaveData() に正しく引き渡されているかが怪しい。
episteme

2022/05/29 06:19

> んで、どこがどういうふうに問題があるんでしょうか。 > コードの説明もなしでは答えようありません 同意。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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