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

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

新規登録して質問してみよう
ただいま回答率
85.50%
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

903閲覧

csv読み込みについて

012304

総合スコア13

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2022/09/09 08:43

編集2022/09/11 00:52

前提

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アイテム
00006012012130050-40410
0000120180181340100-40410
0000180240241400150-40410
0000240300301460200-40410
0000300360361520250-40410

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fp = fopen("enemydata.csv", "rt");

"enemydata.csv"という名前のファイルが存在しないのでは。
このfpの値をチェックしてみよう

投稿2022/09/09 08:47

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

012304

2022/09/09 09:08 編集

存在はしていると思います。ほかの画像ファイルも同じフォルダの中にあって、プレイヤーの画像や背景は、描画できているので、多分階層もあってると思います。画像を追加しておきます。
y_waiwai

2022/09/09 09:05

それはどこにあります? いくら存在してると言っても、そのコードで見つかる場所にないとダメです。 で、fpの値はどうなってるんでしょうか。 VisualStudioならそこで止めて値を確認できるでしょ
y_waiwai

2022/09/09 09:07

ああ、ソースコードの場所においてもダメです 実行ファイルの場所にないと見つけれません。 とりあえずフルパスで記述してみては
012304

2022/09/09 09:30 編集

fp = fopen("C:\\Users\\ninji\source\\repos\Shooting\enemydata.csv", "rt");このようにフルでしてみたのですが、画像のエラーで抜けてしまい、変わりませんでした。fpの値は、fopenの時点では、_Placeholderというものが入って、メモリが読み取れませんとなっています。普通に実行して、エラーで抜けた時は、 c = fgetc(fp);の部分ではfpはnullでした。実行するにあたって、fopenのrtはrに変えました。
y_waiwai

2022/09/09 09:41

文字列中で\は、¥¥と書かないといけません。そうなってませんよね
012304

2022/09/09 09:50

最初は、そうしていました。その後、ただの/に変えても同様でした。
012304

2022/09/10 15:52 編集

すみません。fopenをきちんと入力しなおして実行したらきちんと動くようになりました。 本当にありがとうございました。どこかしらが間違っていたみたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問