指定文字列の読み込み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
banan

指定文字列の読み込み

#1

投稿記事 by banan » 14年前

初心者です
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);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

codeタグを使ってくださいね。詳しくはフォーラムルールを。
http://dixq.net/board/board.html

それと動かすのに構造体などの宣言だけでも欲しいのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

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

#3

投稿記事 by non » 14年前

19行目のwhile((c=fgetc(fp))!=EOF){
は、何をしたいのか説明してください。
non

banan

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

#4

投稿記事 by banan » 14年前

すみません以後気をつけます。

構造体は

コード:

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:でもなかった場合,がくるまで一文字ずつ読み込みます。

non
記事: 1097
登録日時: 15年前

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

#5

投稿記事 by non » 14年前

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

 
non

banan

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

#6

投稿記事 by banan » 14年前

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;
				}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 14年前

banan さんが書きました:fgetsを使ってしまうとまたファイルを最初から読み込むことになってしまうわけなんですね。
一日たってやっとわかりました。
読み込んだ一行の中の文字を最初から一文字ずつ読み込むためにはどうすれば。。
fgetsで既に読み込んでいるのですから、もう一度読み込む必要はなくてfgetsで読み込んだ文字列配列を一文字づつ処理すれば出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

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

#8

投稿記事 by box » 14年前

banan さんが書きました:fgetsを使ってしまうとまたファイルを最初から読み込むことになってしまうわけなんですね。
そういうことは誰も言っていないように思えます。
もし、fgets()がそういう動きをするなら、なんと使いづらい関数であることでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

banan

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

#9

投稿記事 by banan » 14年前

>>softyaさま
すいません
そのfgetsで読み込んだ文字列配列を一文字ずつ処理する方法が調べてみてもよくわかりません

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#10

投稿記事 by softya(ソフト屋) » 14年前

banan さんが書きました:>>softyaさま
すいません
そのfgetsで読み込んだ文字列配列を一文字ずつ処理する方法が調べてみてもよくわかりません
文字列は、文字の配列である事は理解されていますか?
「C言語編 第24章 文字列」
http://www.geocities.jp/ky_webid/c/024.html
まず、ここが理解できるているか教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

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

#11

投稿記事 by box » 14年前

fgets()でファイルから1行まるっと読み込んだ後、その1行の中身であるbuf[]を走査(スキャン)するために、
次の文字を『ファイルから』読み込む関数であるfgetc()を使おうとしているのが間違いです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

banan

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

#12

投稿記事 by banan » 14年前

>>softyaさま
bufが配列だとことをまったく考えていませんでした
for(int j=0;j<9;j++){
      c=buf[j];
のようにしたらとりあえずできました。

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

閉鎖

“C言語何でも質問掲示板” へ戻る