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

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

ただいまの
回答率

90.51%

  • C++

    4176questions

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

ifstreamを使ったテキストファイルからの値を変数に読み込む方法がわからない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 95

6janazi

score 5

明解C++中級編を読んだり、ググっても理解できなかったので質問させていただきます。

ゲーム制作で、ifstreamを使ってテキストファイルに書かれた値を読み込もうとしているのですが、反映されません。ご助力お願いできますでしょうか。

やりたいこと

初期位置の変数、"init_X"・"init_Y"にテキストファイルの値を読み込んで、ここではどちらも200を返したい

実際の状況
テキストファイルから読み込もうとしてもどちらの値も0を返してしまう

現在のコードとテキストファイルの状態

#pragma once
#include <fstream>
using namespace std;

class SaveButton;
class GameObject;
class EnemyHP_AddButton;
class EnemyHP_SubButton;
class X_AddButton;
class X_SubButton;
class Y_AddButton;
class Y_SubButton;
class ClearScoreButton_Add;
class ClearScoreButton_Sub;
class Mouse;
class MainAdmin
{
protected:
    //エディターを読み込んだ時の、自機の初期位置
    int Player_initX;
    int Player_initY;

    int Player_initHP;
    int Enemy_initHP;

    int Clear_Score_init;

    char key[256];
    bool quitApplication;

    int Player_GraphicHandle;

    std::unique_ptr<GameObject>Player;
    std::shared_ptr<Mouse>mouse;

    std::unique_ptr<SaveButton>S_button;

    std::unique_ptr<EnemyHP_AddButton>HPAdd;
    std::unique_ptr<EnemyHP_SubButton>HPSub;

    std::unique_ptr<X_AddButton>X_add;
    std::unique_ptr<X_SubButton>X_Sub;

    std::unique_ptr<Y_AddButton>Y_add;
    std::unique_ptr<Y_SubButton>Y_Sub;

    std::unique_ptr <ClearScoreButton_Add>Clear_Add;
    std::unique_ptr<ClearScoreButton_Sub>Clear_Sub;
public:

    const char* filename;

    MainAdmin();
    ~MainAdmin();
    int GetP_initX() { return Player_initX; }
    int GetP_initY() {
        return Player_initY;
    }
    int GetP_initHP() {
        return Player_initHP;
    }
    int GetE_initHP() {
        return Enemy_initHP;
    }
    int GetClear_Score_Init()
    {
        return Clear_Score_init;
    }
    std::shared_ptr<Mouse> GetMouse() { return mouse; }
    void SetClear_Score_Init(int score) { Clear_Score_init = score; }
    void SetEnemy_HP(int hp) { Enemy_initHP = hp; }
    void SetinitX(int m_x) { Player_initX = m_x; }
    void SetinitY(int m_y) { Player_initY = m_y; }
    char* GetKey() { return key; }
    void Init();

    void Update();

    void SaveFile();

    void end();

};
MainAdmin::MainAdmin():filename("savefile.txt"),quitApplication(false)
{


}




void MainAdmin::Init()
{
    ifstream fileinput;


        //fileinput.open("savefile.txt");
    fileinput.open(filename);

    //ファイルに書き込みがあったらファイルの値を読み込む


        fileinput >> Player_initX >> Player_initY
            >> Player_initHP >> Enemy_initHP
            >> Clear_Score_init;



    fileinput.close();

}


void MainAdmin::SaveFile()
{
    ofstream fileoutput;
    if (!fileoutput.is_open()) {
        fileoutput.open(filename);
    }
    //ファイルに出力する
    fileoutput<< 200 << 200
        << 200 << 200
        << 200;

    DrawString(320, 240, "セーブしました", GetColor(255, 255, 255));
    fileoutput.close();


}
savefile.txt
200200200200200
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • cateye

    2019/03/10 19:42

    Player_initXなどの変数の宣言は何処に?
    200200200200200 を 200 200 200 200 200 にしたらどうでしょう?

    キャンセル

  • 6janazi

    2019/03/10 19:48

    変数の宣言はヘッダファイルに記述しています。説明不足ですいません。

    200 200 200 200 200にしてみましたが効果はありませんでした

    キャンセル

  • cateye

    2019/03/10 19:51 編集

    classの本体は何処にありますか? また、classの中にMainAdmin::Init()がないのですが?

    キャンセル

  • 6janazi

    2019/03/10 19:58

    失礼しました。MainAdminの情報を抜粋したら大事な情報を記述するのを忘れてしまいました。
    Init()はMainAdminに存在します。

    キャンセル

回答 1

checkベストアンサー

0

通常は、class(構造体)にしてInit()に渡すのでしょうが、そうはなってないみたいですね?
また、読み込みは空白で区切られた文字列となるはずですが、savefile.txtはそうは成っていないみたいです。なので、"200200200200200"はintの範囲を超えていると思います。追記にも書きましたが空白で分けたらどうでしょう?
「ソース追記」

#include <iostream>
#include <fstream>
using namespace std;

class MainAdmin
{
  public:
    MainAdmin() { Init(); }

  protected:
    //エディターを読み込んだ時の、自機の初期位置
    int Player_initX;
    int Player_initY;
    int Player_initHP;
    int Enemy_initHP;
    int Clear_Score_init;
    //
    void Init();
    //    void SaveFile();
    //
};

void MainAdmin::Init()
{
    ifstream fileinput;

    fileinput.open("savefile.txt");

    //ファイルに書き込みがあったらファイルの値を読み込む

    fileinput >> Player_initX >> Player_initY >> Player_initHP >> Enemy_initHP
        >> Clear_Score_init;
    //
    fileinput.close();
    //
    cout << Player_initX << ',' << Player_initY << ',' << Player_initHP << ','
         << Enemy_initHP << ',' << Clear_Score_init << endl;
}
//
int main(void)
{
    MainAdmin ma;
    //
    return 0;
}
usr ~/Project/test/teratail % c++ t178700.cpp
usr ~/Project/test/teratail % ./a.out
201,202,203,204,205
usr ~/Project/test/teratail % cat savefile.txt
201 202 203 204 205

usr ~/Project/test/teratail % 

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/10 20:12

    DrawString(320, 240, "セーブしました", GetColor(255, 255, 255));については標準でないので無視してますが・・・

    キャンセル

  • 2019/03/10 20:14

    度々申し訳ございません。filenameは"savefile.txt"を格納するchar型の変数になります。
    コンストラクタで初期化してあります

    キャンセル

  • 2019/03/10 20:18

    では、Init()のファイル名もいりませんね?

    キャンセル

  • 2019/03/10 20:22

    そうですね。initにファイル名を書いたのは質問の最初の段階でfilenameを入れる必要がないかわりに、ファイル名を記述する必要があるのかなと思って変更しました。

    キャンセル

  • 2019/03/10 20:31

    とりあえず端折るだけ端折ってソース上げときますねv^^

    キャンセル

  • 2019/03/10 20:40

    ありがとうございます。書いてくださったコードを試したところ、うまくいきました。
    説明不足な点が多々ありご迷惑をおかけしました。

    キャンセル

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

  • C++

    4176questions

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