前提
https://bituse.info/game/shot/11
こちらのサイトを参考にさせていただいているのですが、csvファイルを読み込むという段階でエラーになってしまって、
https://cvtech.cc/readcsv/
こちらのサイトを参考に読み込む部分を改良してみたのですが、何も読み込めていなく、全部が初期値のままでした。
発生している問題・エラーメッセージ
該当のソースコード
C++
1 2CONTROLL::CONTROLL() 3{ 4 player = new PLAYER; 5 6 back = new BACK; 7 8 FILE* fp; 9 ENEMYDATA data[ENEMY_NUM] = {}; 10 char buf[100] = {}; 11 int c; 12 int col = 1; 13 int row = 0; 14 15 memset(buf, 0, sizeof(buf)); 16 fp = fopen("enemydata.csv", "rt"); 17 while (1) { 18 while (1) { 19 20 c = fgetc(fp); 21 22 //末尾ならループを抜ける。 23 if (c == EOF) 24 goto out; 25 26 //カンマか改行でなければ、文字としてつなげる 27 if (c != ',' && c != '\n') 28 strcat(buf, (const char*)&c); 29 //カンマか改行ならループ抜ける。 30 else 31 break; 32 } 33 //ここに来たということは、1セル分の文字列が出来上がったということ 34 switch (col) { 35 //1列目は敵種類を表す。atoi関数で数値として代入。 36 case 1: data[row].type = atoi(buf); break; 37 //2列目は弾種類。以降省略。 38 case 2: data[row].stype = atoi(buf); break; 39 case 3: data[row].m_pattern = atoi(buf); break; 40 case 4: data[row].s_pattern = atoi(buf); break; 41 case 5: data[row].in_time = atoi(buf); break; 42 case 6: data[row].stop_time = atoi(buf); break; 43 case 7: data[row].shot_time = atoi(buf); break; 44 case 8: data[row].out_time = atoi(buf); break; 45 case 9: data[row].x = atoi(buf); break; 46 case 10: data[row].y = atoi(buf); break; 47 case 11: data[row].speed = atoi(buf); break; 48 case 12: data[row].hp = atoi(buf); break; 49 case 13: data[row].item = atoi(buf); break; 50 } 51 //バッファを初期化 52 memset(buf, 0, sizeof(buf)); 53 //列数を足す 54 ++col; 55 56 //もし読み込んだ文字が改行だったら列数を初期化して行数を増やす 57 if (c == '\n') { 58 col = 1; 59 ++row; 60 } 61 } 62out: 63 //敵クラス生成 64 for (int i = 0; i < ENEMY_NUM; ++i) { 65 enemy[i] = new ENEMY(data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 66 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 67 printfDx("読み込み中"); 68 printfDx("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 69 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 70 } 71}
試したこと
fopenをfopen_sに変えて、エラーを監視したり、
https://cvtech.cc/readcsv/
こちらのサイトを参考に、
csv読み込みの部分を置き換えてみたのですが、すべて0でした。
C++
1CONTROLL::CONTROLL() 2{ 3 player = new PLAYER; 4 5 back = new BACK; 6 7 FILE* fp; 8 ENEMYDATA data[ENEMY_NUM] = {}; 9 char buf[100] = {}; 10 int c; 11 int col = 1; 12 int row = 0; 13 errno_t error; 14 15 memset(buf, 0, sizeof(buf)); 16 error = fopen_s(&fp,"enemydata.csv", "r"); 17 18 //ヘッダ読み飛ばし 19 //while (fgetc(fp) != '\n'); 20 21 while (error == 0) { 22 while (1) { 23 24 c = fgetc(fp); 25 26 //末尾ならループを抜ける。 27 if (c == EOF) 28 goto out; 29 30 //カンマか改行でなければ、文字としてつなげる 31 if (c != ',' && c != '\n') 32 strcat(buf, (const char*)&c); 33 //カンマか改行ならループ抜ける。 34 else 35 break; 36 } 37 //ここに来たということは、1セル分の文字列が出来上がったということ 38 switch (col) { 39 //1列目は敵種類を表す。atoi関数で数値として代入。 40 case 1: data[row].type = atoi(buf); break; 41 //2列目は弾種類。以降省略。 42 case 2: data[row].stype = atoi(buf); break; 43 case 3: data[row].m_pattern = atoi(buf); break; 44 case 4: data[row].s_pattern = atoi(buf); break; 45 case 5: data[row].in_time = atoi(buf); break; 46 case 6: data[row].stop_time = atoi(buf); break; 47 case 7: data[row].shot_time = atoi(buf); break; 48 case 8: data[row].out_time = atoi(buf); break; 49 case 9: data[row].x = atoi(buf); break; 50 case 10: data[row].y = atoi(buf); break; 51 case 11: data[row].speed = atoi(buf); break; 52 case 12: data[row].hp = atoi(buf); break; 53 case 13: data[row].item = atoi(buf); break; 54 } 55 //バッファを初期化 56 memset(buf, 0, sizeof(buf)); 57 //列数を足す 58 ++col; 59 60 //もし読み込んだ文字が改行だったら列数を初期化して行数を増やす 61 if (c == '\n') { 62 col = 1; 63 ++row; 64 } 65 } 66out: 67 //敵クラス生成 68 for (int i = 0; i < ENEMY_NUM; ++i) { 69 enemy[i] = new ENEMY(data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 70 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 71 printfDx("読み込み中"); 72 printfDx("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 73 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 74 } 75}
C++
1vector<string> split(string& input, char delimiter) 2{ 3 istringstream stream(input); 4 string field; 5 vector<string> result; 6 while (getline(stream, field, delimiter)) { 7 result.push_back(field); 8 } 9 return result; 10} 11CONTROLL::CONTROLL() 12{ 13 player = new PLAYER; 14 15 back = new BACK; 16 17 FILE* fp; 18 ENEMYDATA data[ENEMY_NUM] = {}; 19 char buf[100]; 20 ifstream ifs("enemyData.csv"); 21 22 string line; 23 while (getline(ifs, line)) { 24 vector<string> strvec = split(line, ','); 25 for (int i = 0; i < strvec.size(); i++) { 26 data[i].type = stoi(strvec.at(i)); 27 data[i].stype = stoi(strvec.at(i)); 28 data[i].m_pattern = stoi(strvec.at(i)); 29 data[i].s_pattern = stoi(strvec.at(i)); 30 data[i].in_time = stoi(strvec.at(i)); 31 data[i].stop_time = stoi(strvec.at(i)); 32 data[i].shot_time = stoi(strvec.at(i)); 33 data[i].out_time = stoi(strvec.at(i)); 34 data[i].x = stoi(strvec.at(i)); 35 data[i].y = stoi(strvec.at(i)); 36 data[i].speed = stoi(strvec.at(i)); 37 data[i].hp = stoi(strvec.at(i)); 38 data[i].item = stoi(strvec.at(i)); 39 } 40 } 41 //敵クラス生成 42 for (int i = 0; i < ENEMY_NUM; ++i) { 43 enemy[i] = new ENEMY(data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 44 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 45 printfDx("読み込み中"); 46 printfDx("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, 47 data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); 48 } 49}
補足情報(FW/ツールのバージョンなど)
csvの情報です。
列1 | 列2 | 列3 | 列4 | 列5 | 列6 | 列7 | 列8 | 列9 | 列10 | 列11 | 列12 | 列13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
敵種類 | 弾種類 | 移動パターン | 発射パターン | 出現時間 | 停止 | 発射 | 帰還 | X座標 | Y座標 | 弾スピード | HP | アイテム |
0 | 0 | 0 | 0 | 60 | 120 | 121 | 300 | 50 | -40 | 4 | 1 | 0 |
0 | 0 | 0 | 0 | 120 | 180 | 181 | 340 | 100 | -40 | 4 | 1 | 0 |
0 | 0 | 0 | 0 | 180 | 240 | 241 | 400 | 150 | -40 | 4 | 1 | 0 |
0 | 0 | 0 | 0 | 240 | 300 | 301 | 460 | 200 | -40 | 4 | 1 | 0 |
0 | 0 | 0 | 0 | 300 | 360 | 361 | 520 | 250 | -40 | 4 | 1 | 0 |
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/09 09:08 編集
2022/09/09 09:05
2022/09/09 09:07
2022/09/09 09:30 編集
2022/09/09 09:41
2022/09/09 09:50
2022/09/10 15:52 編集