こちらに関して質問があります。
こちらより参照:
http://dixq.net/forum/viewtopic.php?f=3&t=9640#p77747
// 1行飛ばす
int SkipOneLine( int FileHdl ){
int Ch;
while( 1 ){
Ch = FileRead_getc( FileHdl );
if( Ch == -1 ){
return -1;
}
if( Ch == '\n' ){
return 0;
}
}
return -1;
}
//敵の出現情報をエクセルから読み込んで格納する関数
void load_story(){
int FileHdl;//ファイルハンドル
FileHdl = FileRead_open( "../dat/csv/11章/storyH0.csv" );//ファイル読み込み
if( FileHdl == 0 ){ //読めなかったらエラー
printfDx("read error\n");
return;
}
SkipOneLine( FileHdl ) ; //最初の二行は飛ばす
SkipOneLine( FileHdl ) ;
int n=0;
int InputChar; //一文字格納する入れ物
int ScannedNum; //スキャンできた個数
while( 1 ){
InputChar = FileRead_getc( FileHdl );//1文字取得する
if( InputChar == '/' ){ //スラッシュがあれば
SkipOneLine( FileHdl ) ;//一行読み飛ばし
continue;
} else { //スラッシュじゃなければ
FileRead_seek( FileHdl, -1, SEEK_CUR ) ;//さっき読んだ一文字戻す
}
//書式指定に応じて一行分読み込み
ScannedNum = FileRead_scanf(
FileHdl,
"%d,%d,%d,%lf,%lf,%lf,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
&enemy_order[n].cnt,
&enemy_order[n].pattern,
&enemy_order[n].knd,
&enemy_order[n].x,
&enemy_order[n].y,
&enemy_order[n].sp,
&enemy_order[n].bltime,
&enemy_order[n].blknd,
&enemy_order[n].col,
&enemy_order[n].hp,
&enemy_order[n].blknd2,
&enemy_order[n].wait,
&enemy_order[n].item_n[0],
&enemy_order[n].item_n[1],
&enemy_order[n].item_n[2],
&enemy_order[n].item_n[3],
&enemy_order[n].item_n[4],
&enemy_order[n].item_n[5]
);
if( ScannedNum != 18 ){ //18個全部読めなかったら処理を抜ける
break;
}
n++;
}
FileRead_close( FileHdl );
}
/カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 弾種類 待機時間 アイテム1 2 3 4 5 6
/cnt pattern knd x座標 y座標 sp bltime blknd col hp blknd2 wait item_n[0]
100 0 0 50 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
110 0 0 80 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
120 0 0 110 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
130 0 0 140 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
140 0 0 170 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
150 0 0 200 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
160 0 0 230 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
170 0 0 260 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
180 0 0 290 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
190 0 0 320 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
上記コードで気になるところですが
while( 1 ){
InputChar = FileRead_getc( FileHdl );//1文字取得する
if( InputChar == '/' ){ //スラッシュがあれば
SkipOneLine( FileHdl ) ;//一行読み飛ばし
continue;
} else { //スラッシュじゃなければ
FileRead_seek( FileHdl, -1, SEEK_CUR ) ;//さっき読んだ一文字戻す
}
こちらのwhile文のなかのスラッシュがあれば読み飛ばすという部分になります。
上記のファイルで数値が入っている行の最初のセルに/を入れてみたところその行だけ読み飛ばされる
のかと思ったのですが以降の普通の数値が記入されている行まで読み飛ばされてしまいます。
例えば5行目最初の[120]を[/120]に変更すると
/120 0 0 110 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
/を入れた行及び以降の行全て読み飛ばされます。下記も読み込まれません。
130 0 0 140 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
140 0 0 170 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
150 0 0 200 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
160 0 0 230 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
170 0 0 260 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
180 0 0 290 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
190 0 0 320 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
正確には読み飛ばすのではなくif(ScannedNum != 18)が成立してwhile文を抜けてしまっている気がします。
改良版ではない11章に記載されていたプログラムで同様のことをして実行すると5番目のenemyだけ表示されず、
正常にその行のデータだけ読み飛ばしてくれたことを確認しております。こちらの改良版のコードで同様の実行結果に
したい場合はどのようにすればよいのでしょうか。
自分なりに少しコードを変えてみたところこちらなら同様の実行結果が得られました。('/' を34に変えただけですが)
ただし、これだと行の最初のセルが文字列だった場合if文で読み飛ばすというような処理をしているので
行の最初以外のセルが文字列だった場合は有効ではないですね。
while( 1 ){
InputChar = FileRead_getc( FileHdl );//1文字取得する
if( InputChar == 34){ //ダブルクォーテーションであれば
SkipOneLine( FileHdl ) ;//一行読み飛ばし
continue;
} else { //ダブルクォーテーションじゃなければ
FileRead_seek( FileHdl, -1, SEEK_CUR ) ;//さっき読んだ一文字戻す
}
どなたかご教授お願い致します。