全然エラーが直りません。以下のコードのどこが間違っているのでしょうか?
理想ではData.txtの1行が読み込めているはずなのですが、表示画面に遷移したとたんdebug assertion Failedになります。
vector out of range と書いてあるので「存在しないメモリにアクセスしてるよ」と言われてるそうなのですがpush_backで末尾に追加されていればString[0][1]には単語(15文字以内)が格納されているはずです。また、vectorを使用していないBufferも表示してみましたがエラーは出ないものの何も表示されませんいったい何がどうなっているのでしょうか?
環境 windows10,visualstudio2015community,C++,Dxライブラリ使用
これ以外のコードはファイルはhttp://dixq.net/forum/viewtopic.php?f=3&t=18326に載っています。
Load.h
#pragma once
#include <cstring>
#include <sstream>
#include <vector>
#define WORD_COUNTS 3000//記憶可能な単語種数
#define CHARACTERS 64//記憶可能な文字数
class Load{
private:
int FileHandle;
int Case;
int Now;
std::string Buffer;
std::vector<std::vector<std::string>> String{
{"EnglishWord"},
{"JapaneseWord1"},
{"JapaneseWord2"},
{"JapaneseWord3"},
{"EnglishSentence"},
{"JapaneseSentence"}
};
public:
Load();
~Load();
int LoadData();
void Draw();
};
#include "Load.h"
#include "DxLib.h"
#include "Common.h"
#include <fstream>
Load::Load(){
Case = 0;
Now = 0;
}
int Load::LoadData(){
std::ifstream ifs("Load/Data.txt");
if (ifs.fail()) {
DrawString(20, 20, "ファイル読み込み失敗", Color);
return -1;
}
else{
DrawString(20, 20, "ファイル読み込み成功", Color);
while (getline(ifs, Buffer)){
std::string tmp;
std::istringstream stream(Buffer);
int i = 0;
while (getline(stream, tmp,'/')){
String[i].push_back(tmp);
i++;
}
}
return 0;
}
ifs.close();
}
void Load::Draw(){
DrawString(0, 30, String[0][1].c_str(), Color);
DrawString(0, 0, Buffer.c_str(), Color);
}
Load::~Load(){
}
#pragma once
#include "ScreenTransition.h"
#include "TitleScreen.h"
#include "ChoiceScreen.h"
#include "Load.h"//一時的
class StateTransition{
private:
int NowStateNum;
int BackScreenGh;
ScreenTransition* screen[4];
TitleScreen titleS;
ChoiceScreen choiceS;
Load* load;//一時的
public:
StateTransition();
~StateTransition();
void Draw();
void Transition();
};
#include "StateTransition.h"
#include "Common.h"//完成後必要ない
#include "Keyboard.h"
#include "DxLib.h"
StateTransition::StateTransition(){
NowStateNum = 0;
BackScreenGh= LoadGraph("Graph/backscreen.png");//640*400
screen[0] = &titleS;
screen[1] = &choiceS;
load = new Load;
}
void StateTransition::Draw(){
DrawGraph(0, 0, BackScreenGh, TRUE);
}
void StateTransition::Transition() {
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
Keyboard::Instance()->Update();
Draw();
switch (NowStateNum) {
case 0:
screen[0]->Transition();
if(screen[0]->GetActiveFlag()==false)NowStateNum++;
break;
case 1:
screen[1]->Transition();
if (screen[1]->GetActiveFlag() == false)NowStateNum++;
break;
default:
DrawFormatString(320, 150, Color, "%d", NowStateNum);
load->Draw();
break;
}
//if (Keyboard::Instance()->GetPressingCount(KEY_INPUT_RETURN) == 1)NowStateNum++;
if (Keyboard::Instance()->GetPressingCount(KEY_INPUT_ESCAPE) != 0)break;
}
}
StateTransition::~StateTransition(){
}
#include <DxLib.h>
#include "Common.h"
#include "Load.h"
#include "StateTransition.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
SetGraphMode(WIDTH, HEIGHT, BITS);
SetMainWindowText(TITLE);
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
SetAlwaysRunFlag(TRUE);
ChangeFont("游明朝");
Load* load = new Load;
load->LoadData();
{
StateTransition st;
st.Transition();
}
DxLib_End();
delete load;
return 0;
}