自分は、東方Projectのミュージックルームの再現をしています。前々回はソースに打ち込んだ文字列を指定の座標に表示するプログラムを教えて頂きましたが、今回はCSVファイルから曲のパス、曲名1、曲名2、コメントを読み込んで表示するプログラムを書いてみたのですが、うまく表示されません。CSVファイルは以下の様になっています。
読みづらいようでしたら言ってくだされば元のCSVファイルを添付します。
# この記号でコメントです
# 曲の情報
# パス、曲名1、曲名2、コメントの順番
dat/th06_01.wav,No1. 赤より紅い夢,♪赤より紅い夢,コメント1
dat/th06_02.wav,No2. ほおずきみたいに紅い魂,♪ほおずきみたいに紅い魂,コメント2
dat/th06_03.wav,No3. 妖魔夜行,♪妖魔夜行,コメント3
dat/th06_04.wav,No4. ルーネイトエルフ,♪ルーネイトエルフ,コメント4
dat/th06_05.wav,No5. おてんば恋娘,♪おてんば恋娘,コメント5
dat/th06_06.wav,No6. 上海紅茶館 ~ Chinese Tea,♪上海紅茶館 ~ Chinese Tea,コメント6
dat/th06_07.wav,No7. 明治十七年の上海アリス,♪明治十七年の上海アリス,コメント7
dat/th06_08.wav,No8. ヴワル魔法図書館,♪ヴワル魔法図書館,コメント8
dat/th06_09.wav,No9. ラクトガール ~ 少女密室,♪ラクトガール ~ 少女密室,コメント9
dat/th06_10.wav,No10. メイドと血の懐中時計,♪メイドと血の懐中時計,コメント10
dat/th06_11.wav,No11. 月時計 ~ ルナ・ダイアル,♪月時計 ~ ルナ・ダイアル,コメント11
dat/th06_12.wav,No12. ツェペシュの幼き末裔,♪ツェペシュの幼き末裔,コメント12
dat/th06_13.wav,No13. 亡き王女の為のセプテット,♪亡き王女の為のセプテット,コメント13
dat/th06_14.wav,No14. 魔法少女達の百年祭 ,♪魔法少女達の百年祭,コメント14
dat/th06_15.wav,No15. U.N.オーエンは彼女なのか?,♪U.N.オーエンは彼女なのか?,コメント15
dat/th06_16.wav,No16. 紅より儚い永遠,♪紅より儚い永遠,コメント16
dat/th06_17.wav,No17. 紅楼 ~ Eastern Dream...,♪紅楼 ~ Eastern Dream...,コメント17
どうすればうまく表示出来るでしょうか?汚いコードですが宜しくお願いします。
#define _CRT_SECURE_NO_WARNINGS 1
#include "DxLib.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char path[ 16 ]; // 曲のパスを格納
char name1[ 64 ]; // 曲名1を格納
char name2[ 128 ]; // 曲名2を格納
char comme[ 64 ]; // コメントを格納.とりあえずテストの段階だから一行で
}music_t;
static music_t music[ 16 ];
int ProcessLoop() // 毎回行う事
{
if( ProcessMessage() != 0 ) return 1;
if( ClearDrawScreen() != 0 ) return 1;
return 0;
}
void Load_Script() // CSVファイルを読み込む
{
char FileName[] = "music.csv"; // 読み込むファイルの名前
int i,num=0,n=0; // forとかswitchで使う
int input[64]; // int版一文字格納
char inputc[64]; // cahr版一文字格納
FILE* fp = fopen( FileName , "r" ); // ファイルを読み込み形式で読み込む
if( fp == NULL ){ // ファイルが無かった時
MessageBox( NULL, TEXT("Script File Read Error"), TEXT("Error"), MB_OK | MB_ICONERROR );
return;
}
for(i=0 ; i<4 ; i++ ) // 最初の4行はコメントなので読み飛ばす
while( fgetc( fp ) != '\n' );
while( 1 ){
for(i=0 ; i<64 ; i++ ){
input[i] = inputc[i] =fgetc( fp );
if( input[i] == '#' ){ // コメント記号だったら
while( fgetc( fp ) != '\n' ); // \nまで飛ばす
i = -1; // カウンタを戻して
continue;
}
if( input[i] == ',' || input[i] == '\n' ){ // 改行かコンマなら
input[i] = '\0'; // そこまでを文字列として
break;
}
if( input[i] == EOF ){ // もしEOFだったら
goto EXFILE;
}
}
switch( num ){ //
case 0: strcpy( music[n].path , inputc ); break; // パスをinputcから構造体にコピー(パス)
case 1: strcpy( music[n].name1, inputc ); break; // パスをinputcから構造体にコピー(曲名1)
case 2: strcpy( music[n].name2, inputc ); break; // パスをinputcから構造体にコピー(曲名2)
case 3: strcpy( music[n].comme, inputc ); break; // パスをinputcから構造体にコピー(コメント)
}
num++;
if( num == 4 ){
num = 0;
n++;
}
}
EXFILE:
fclose( fp ); // ファイルを閉じる
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode( TRUE ) , SetAlwaysRunFlag( TRUE ) , DxLib_Init() , SetDrawScreen( DX_SCREEN_BACK );
// ウィンドウモード、常に作動する、DXLIBの初期化、裏画面に描写
int i; // for用
Load_Script(); // CSV読み込み
while( !ProcessLoop() ){ // メインループ
for(i=0 ; i<17 ; i++ ){ // 全曲分のループ
DrawFormatString( 0, 0+18*i, GetColor(255,255,255), "%s", music[i].path ); // とりあえずテストでパスを表示
}
ScreenFlip(); //
}
DxLib_End(); // DxLibの終了
return 0;
}
使用ライブラリ : Dxライブラリ
コンパイラ : Visual C++ 2008 Express Edition
OS : windows XP
#追記 とくに意味はないですが、コードタグでくくりました