早速ですが質問させていただきます。
現在音ゲーを作成中なのですが、曲の一覧を取得するのにてこずっています。
形式としては、StepManiaやこちらで配布されているAerobeatPlusのようにファイルを作ることで自動的にデータを読み取るものを目指しています。
今のところ、FindFirstFile系列で特定のフォルダ以下に入っているフォルダを列挙し、その中にtxtファイルがあれば開く。
txtファイルには曲情報(曲名や、BPM)などが入っており、それぞれを用意した構造体にいれていく事で一覧表示できるようにしています。
しかし、ファイル列挙→txtファイルならば特定の処理を行う、まではうまく行ったのですが、その先のファイルオープンから中身を構造体に入れることができません。
そこで質問なのですが、
一、charで宣言したファイルパスではfopenで開けないのでしょうか。
二、もし開けるのであれば、中身はfgetsで一行ごとに読み込むのがいいのでしょうか。それとも配列に一文字ずつ入れるほうがいいのでしょうか
三、この方法でいいのでしょうか。もしも他に効率の良い方法があればヒントだけでもいいので教えていただけると幸いです。
また、列挙からデータ取得まで一発で行っています。
//構造体宣言
typedef struct {
char *filepath;
char *title, *rubi;
int bpm, music_long;
int difficulty_easy, difficulty_nomale, difficulty_hard, difficulty_caos;
} NewMusicInfo;
NewMusicInfo MusicInfo[400];
//ファイル列挙
void music_folder (char *pszBasePath) {
char szSearchPath[MAX_PATH+1];
char szSubPath[MAX_PATH+1];
char szFileName[MAX_PATH+1];
int n = 0;
WIN32_FIND_DATA fd;
lstrcpy(szSearchPath, pszBasePath);
if (szSearchPath[lstrlen(szSearchPath)-1] != '*') {
lstrcat(szSearchPath, "*");
}
HANDLE hFind = FindFirstFile(szSearchPath, &fd);
do {
if (lstrcmp(fd.cFileName, "..") != 0 && lstrcmpi(fd.cFileName, ".") != 0) {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
// ディレクトリの場合
lstrcpy(szSubPath, pszBasePath);
lstrcat(szSubPath, fd.cFileName);
lstrcat(szSubPath, "\\");
music_folder(szSubPath);
} else {
// ファイルの場合
lstrcpy(szFileName, pszBasePath);
lstrcat(szFileName, fd.cFileName);
if (stricmp(PathFindExtension(szFileName),TEXT(".txt")) == 0) { //txtファイルであれば
FILE *fp;
char fileline[256];
fp = fopen(szFileName,"r");
if (fp == NULL) { printDx( "File Open Error" ); break; }
int linenomber = 0, n = 0;
while (NULL != (fgets(fileline, 256, fp))) {
//構造体にデータを入れる処理
}
}
}
}
} while(FindNextFile(hFind, &fd));
FindClose(hFind);
return;
}
//WinMainにてmusic_folder("data/Movie/");として関数を呼び出しています。
もし、意味が伝わらないところがあれば遠慮なく言ってくださって結構です。
また、ファイル列挙のアルゴリズムに関しては検索時に出てきたものを使用しています。
長文、乱文失礼しました。