ページ 11

指定文字列の読み込み

Posted: 2011年8月15日(月) 09:46
by banan
初心者です
test.txtを一行ずつ読み込んで
BPM:という表記があったらその次の数字を読み込み
#STARTがあったらstage.startflagに1を代入し、
#ENDがあったらstage.startflagに0を代入するようなことをしたいのですが
その部分の条件がうまく分岐してくれません><
どうすればよいのでしょうか?
説明下手ですみません。


test.txt

コード:

BPM:204
#START
00010002,
00030004,
,
#END

コード:

void load_humen(){
	int i=0,cnt=0,cnt2=0;
	int c;
	FILE *fp;
	char buf[1024];
	fp=fopen("dat/humen/test.txt","r");
	if(fp==NULL)return;
	while(fgets( buf, 1023, fp ) != NULL){
		if((strstr(buf,"BPM:"))!=NULL){//問題:ここがNULL以外にならない
			sscanf_s(buf,"BPM:%d",&stage.bpm);
			stage.bpm=204;
		}
		if(strstr(buf,"#START")!=NULL){//ここも
			stage.startflag=1;
	 	}
		if(strstr(buf,"#END")!=NULL){//ここも
			stage.startflag=0;
	 	}
		while((c=fgetc(fp))!=EOF){
			if(stage.startflag==1){
				if(c=='1'){
					humen[i].flag=1;
					humen[i].cnt=cnt;
					humen[i].knd=1;
					i++;
				}
				if(c=='2'){
					humen[i].flag=1;
					humen[i].cnt=cnt;
					humen[i].knd=2;
					i++;
				}
				if(c=='3'){
					humen[i].flag=1;
					humen[i].cnt=cnt;
					humen[i].knd=3;
					i++;
				}
				if(c=='4'){
					humen[i].flag=1;
					humen[i].cnt=cnt;
					humen[i].knd=4;
					i++;
				}
				if(c==','){
					//imax++;
					break;
				}
				cnt++;
			}
			
		}
		cnt2++;
	}
	fclose(fp);
}

Re: 指定文字列の読み込み

Posted: 2011年8月15日(月) 10:49
by softya(ソフト屋)
codeタグを使ってくださいね。詳しくはフォーラムルールを。
http://dixq.net/board/board.html

それと動かすのに構造体などの宣言だけでも欲しいのですが。

Re: 指定文字列の読み込み

Posted: 2011年8月15日(月) 12:40
by non
19行目のwhile((c=fgetc(fp))!=EOF){
は、何をしたいのか説明してください。

Re: 指定文字列の読み込み

Posted: 2011年8月15日(月) 17:10
by banan
すみません以後気をつけます。

構造体は

コード:

typedef struct{//ひとつのファイル
	int flag;
	int cnt;
	int spd,bpm;
	float level,scoreinit,scorediff,songvol,sevol,scroll,measue;
	int humen_cnt,balloon,gogoflag,startflag;
}stage_t;

typedef struct{//0とか1
	int flag;//
	int cnt;//最初から数えて何番目にあるか?
	int knd;//1234
	char wave;
}humen_t;


GLOBAL stage_t stage;
GLOBAL humen_t humen[1000];//譜面


19行目のwhile((c=fgetc(fp))!=EOF){で
読み込んだ一行(00010002,)が#STARTでも#ENDでもBPM:でもなかった場合,がくるまで一文字ずつ読み込みます。

Re: 指定文字列の読み込み

Posted: 2011年8月15日(月) 17:29
by non
banan さんが書きました:19行目のwhile((c=fgetc(fp))!=EOF){で
読み込んだ一行(00010002,)が#STARTでも#ENDでもBPM:でもなかった場合,がくるまで一文字ずつ読み込みます。
ヒントのつもりで、注意を喚起したのですがわからなかったみたいですね。
1行目の BPM:204 を 8行目のfgetsで読み込んだ後、2行目の #START はその19行目の fgetcで
読み込むことになりますよ。
読み込みは8行目のfgetsだけにした方が良いです。

 

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 21:21
by banan
fgetsを使ってしまうとまたファイルを最初から読み込むことになってしまうわけなんですね。
一日たってやっとわかりました。
読み込んだ一行の中の文字を最初から一文字ずつ読み込むためにはどうすれば。。
19行目以下を次のように書き換えてみたのですが何も表示されなくなってしまいました><

コード:

if(stage.startflag==1){
          for(int x=0;x<100;x++){//ここと
	scanf( buf,&c );//ここを書き換えた
					if(c=='1'){
						humen[i].flag=1;
						humen[i].cnt=cnt;
						humen[i].knd=1;
						i++;
					}
					if(c=='2'){
						humen[i].flag=1;
						humen[i].cnt=cnt;
						humen[i].knd=2;
						i++;
					}
					if(c=='3'){
						humen[i].flag=1;
						humen[i].cnt=cnt;
						humen[i].knd=1;
						i++;
					}
					if(c=='4'){
						humen[i].flag=1;
						humen[i].cnt=cnt;
						humen[i].knd=2;
						i++;
					}
					if(c==','){
						break;
					}
					hosei=(float)(16 / mojisuu);
					cnt+=(int)(32*stage.scroll*hosei);
					shousetu+=1;
				}

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 21:27
by softya(ソフト屋)
banan さんが書きました:fgetsを使ってしまうとまたファイルを最初から読み込むことになってしまうわけなんですね。
一日たってやっとわかりました。
読み込んだ一行の中の文字を最初から一文字ずつ読み込むためにはどうすれば。。
fgetsで既に読み込んでいるのですから、もう一度読み込む必要はなくてfgetsで読み込んだ文字列配列を一文字づつ処理すれば出来ます。

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 21:33
by box
banan さんが書きました:fgetsを使ってしまうとまたファイルを最初から読み込むことになってしまうわけなんですね。
そういうことは誰も言っていないように思えます。
もし、fgets()がそういう動きをするなら、なんと使いづらい関数であることでしょうか。

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 21:58
by banan
>>softyaさま
すいません
そのfgetsで読み込んだ文字列配列を一文字ずつ処理する方法が調べてみてもよくわかりません

>>boxさま
細かく書くとfgetsはファイルから直接読み込むもので
8行目の部分で読み込んだ一行を19行目でさらに細かく一文字ずつ読み込むために使用していたので
それはできないと思っていたのですがこれでも間違って理解いたら訂正お願いしますm(_ _)m

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 22:03
by softya(ソフト屋)
banan さんが書きました:>>softyaさま
すいません
そのfgetsで読み込んだ文字列配列を一文字ずつ処理する方法が調べてみてもよくわかりません
文字列は、文字の配列である事は理解されていますか?
「C言語編 第24章 文字列」
http://www.geocities.jp/ky_webid/c/024.html
まず、ここが理解できるているか教えて下さい。

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 22:05
by box
fgets()でファイルから1行まるっと読み込んだ後、その1行の中身であるbuf[]を走査(スキャン)するために、
次の文字を『ファイルから』読み込む関数であるfgetc()を使おうとしているのが間違いです。

Re: 指定文字列の読み込み

Posted: 2011年8月17日(水) 22:24
by banan
>>softyaさま
bufが配列だとことをまったく考えていませんでした
for(int j=0;j<9;j++){
      c=buf[j];
のようにしたらとりあえずできました。

>>boxさま
納得です!お二方ともありがとうございましたm(_ _)m