- ベストアンサー
ファイルの読み込みプログラムでデータを出力できない問題
- ファイルの読み込みプログラムを作成しましたが、データを出力できません。
- 教えていただけませんか?
- プログラムの作成に関する質問です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
修正してみました ---------------------------------------------------------------- #include<stdio.h> #include<string.h> #include<stdlib.h> #define NFA_STATE_MAX 128 #define NSYMBOL 3 typedef struct nlist{ int c; int to; int from; }nlist_t; int main(void){ char line[255]; FILE *fp; int i,j; char atranbysymbol[100]; char *tranofsymbol; char *symbol[NSYMBOL]; int ntran = 0; int nstate=4; // nsymbol=NSYMBOL; nlist_t nfa[NFA_STATE_MAX]; if((fp = fopen("data.txt", "r")) == NULL){ printf("Can't Open This File.?n"); exit(1); } for(i=0; i<nstate; i++){ int ns = 0; fgets(line,255,fp); tranofsymbol = strtok(line,"|"); while(tranofsymbol != NULL){ symbol[ns++] = tranofsymbol; tranofsymbol = strtok(NULL,"|\n"); } for(j=0; j<NSYMBOL;j++){ char *sto; sto = strtok(symbol[j]," "); while(sto != NULL){ if(*sto !='E'){ nfa[ntran].from = i; nfa[ntran].to = atoi(sto); nfa[ntran++].c = j - 1; } sto = strtok(NULL, " "); } } } for(i=0; i<ntran; i++){ printf("From: %d To: %d on Symbol: %d \n", nfa[i].from, nfa[i].to, nfa[i].c); } return 0; }
その他の回答 (7)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5のプログラムですが、 #1の補足で From: 3 to: 3 by symbol: 0 From: 3 to: 0 by symbol: 1 にしたいとありましたので、 E | E | 0 の時 From: 3 to: 3 by symbol: 0 From: 3 to: 0 by symbol: 1 にするのだと思っていました。 #5>εは-1にしたい 2 | E | 0 の時 From: 3 to: 2 by symbol: -1 にするという意味ですか?
補足
BLUEPIXYさん >#1の補足で >From: 3 to: 3 by symbol: 0 >From: 3 to: 0 by symbol: 1 >にしたいとありましたので、 >E | E | 0 >の時 >From: 3 to: 3 by symbol: 0 >From: 3 to: 0 by symbol: 1 >にするのだと思っていました。 説明下手で大変申し訳ございません。 >2 | E | 0 >の時 >From: 3 to: 2 by symbol: -1 >にするという意味ですか? はい、そういう意味です。 ずうずうしい質問ですいません。 お忙しいとは思いますが、よろしく御願いいたします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5>いまさらだけど、strcpy要らないね
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
//#4の方針で修正したプログラム #if 0 data.txt: E | 1 3 | 1 E | 2 | 1 2 E | 3 | 0 E | E | 0 説明: 縦(状態)が上から順に0、1、2、3 横(シンボル)、左から順にE、0、1 処理結果: From: 0 to: 1 by symbol: 0 From: 0 to: 3 by symbol: 0 From: 0 to: 1 by symbol: 1 From: 1 to: 2 by symbol: 0 From: 1 to: 1 by symbol: 1 From: 1 to: 2 by symbol: 1 From: 2 to: 3 by symbol: 0 From: 2 to: 0 by symbol: 1 From: 3 to: 3 by symbol: 0 From: 3 to: 0 by symbol: 1 #endif #include<stdio.h> #include<string.h> #include<stdlib.h> #define NFA_STATE_MAX 128 #define NSYMBOL 2 typedef struct nlist{ int c; int to; int from; }nlist_t; int main(void){ char line[255]; FILE *fp; int i,j; char atranbysymbol[100]; char *tranofsymbol; char *symbol[NSYMBOL]; int ntran = 0; int nstate=4; // nsymbol=NSYMBOL; nlist_t nfa[NFA_STATE_MAX]; if((fp = fopen("data.txt", "r")) == NULL){ printf("Can't Open This File.?n"); exit(1); } for(i=0; i<nstate; i++){ int ns = 0; fgets(line,255,fp); tranofsymbol = strtok(line,"|");//1個目は飛ばす while(NULL!=(tranofsymbol = strtok(NULL,"|\n"))){ symbol[ns++] = tranofsymbol; } for(j=0; j<NSYMBOL;j++){ char *sto; strcpy(atranbysymbol, symbol[j]); sto = strtok(atranbysymbol," "); while(sto != NULL){ nfa[ntran].from = i; nfa[ntran].c = j; nfa[ntran++].to = (*sto!='E')? atoi(sto) : i ; sto = strtok(NULL, " "); } } } for(i=0; i<ntran; i++){ printf("From: %d To: %d on Symbol: %d \n", nfa[i].from, nfa[i].to, nfa[i].c); } return 0; }
補足
BLUEPIXYさん 返事が遅くなり、大変申し訳ございません。 早速教えていただき、ありがとうございました。 先ほどまで、教えていただいたサンプルを使用させていただき、 やってみました。 いくつか質問させてください。 1つ目なんですが、 nfa[ntran++].to = (*sto!='E')? atoi(sto) : i ; はどういう意味でしょうか? 2つ目は、説明が下手ですいませんでした。 ファイル(data.txt)データなんですが、 E | 1 3 | 1 E | 2 | 1 2 E | 3 | 0 E | E | 0 と書いてますが、例えば、 シンボルεの所が、今はすべてEになっていますが、 これがたとえば、 E | 1 3 | 1 1 | 2 | 1 2 E | 3 | 0 2 | E | 0 とかになっている時もあり、εは-1にしたいと考えています。 そのとき、どうすればいいか教えていただけないでしょうか? 最後に、出力で、 From: 3 to: 3 by symbol: 0 とありますが、状態3でシンボル0のときはEなので、nfaには格納しません。いままでこの3つについて考えていたのですが、どうもわかりません。 プログラミング初心者なもので、どう書いていいかわかりません。 どうかお忙しいとは思いますが、よろしく御願いいたします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1補足> 説明と、したい結果があわないと思いますが・・ 縦(状態)が上から順に0、1、2、3 横(シンボル)、左から順にE、0、1 From: 0 to: 1 by symbol: 0 From: 0 to: 3 by symbol: 0 From: 0 to: 1 by symbol: 1 From: 1 to: 2 by symbol: 0 From: 1 to: 1 by symbol: 1 From: 1 to: 2 by symbol: 1 From: 2 to: 3 by symbol: 0 From: 2 to: 0 by symbol: 1 From: 3 to: 3(E?) by symbol: 0 From: 3 to: 0 by symbol: 1 の間違いではないでしょうか
- norisenbei
- ベストアンサー率13% (10/76)
#2です。 strcmp(sto,"E")だと0以外の数字返ってきそうですね。 失礼しました。
- norisenbei
- ベストアンサー率13% (10/76)
No.1の方も書いてますが、それぞれの処理でなにがしたいのか コメントいれたほうが、判りやすいかと思います。 たぶん1行ずつデータを読み込んで、nfaに格納したいんだとは思いますが それぞれの処理でなにをやりたかったのかがちょっと判りません。 とりあえず何も出力されないってゆうのは strtok(line,"|")で"|"区切りでデータ分割して atranbysymbolに格納して それを再度strtok(line," ")で分割したいように見えますが、 atranbysymbolには" "区切りで格納されてないので strcmp(sto, "E")が0しか返さずntranが0のままなんだと思います。 デバッガが使えないようであれば、処理毎に変数値をprintfとかで確認 してみるのが良いです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
もう一つしたいことがよくわからないので、なんですが、、 strtokの動作と atranbysymbol[ns++] = *tranofsymbol; とかは、動作を勘違いしているような気がします
補足
補足説明なしで申し訳ありませんでした。 字数制限があり、プログラムだけしか掲載できなかったもので。 ちょっとややこしいんですが、何がやりたいか説明させていただきます。 データファイルなんですが、書いてないんですが、縦(状態)が上から順に0、1、2、3を表していまして、横(シンボル)、左から順に0、1、εを表しています。 例えば、13の所は、状態0がシンボル1で状態1か3に行くという意味です。Eはどこも行く所がないので、構造体nfaには格納しません。”|”は区切るために使っているため、これもnfaには格納しません。それで、実行結果なんですが、 From: 0 to: 1 by symbol: 0 From: 0 to: 3 by symbol: 0 From: 0 to: 1 by symbol: 1 From: 1 to: 3 by symbol: 0 From: 1 to: 0 by symbol: 1 From: 2 to: 3 by symbol: 0 From: 2 to: 0 by symbol: 1 From: 3 to: 3 by symbol: 0 From: 3 to: 0 by symbol: 1 としたいのですが、今 From: 0 To: 0 on Symbol: -1 From: 0 To: 0 on Symbol: 0 From: 0 To: 0 on Symbol: 1 From: 1 To: 0 on Symbol: -1 From: 1 To: 0 on Symbol: 0 From: 1 To: 0 on Symbol: 1 From: 2 To: 0 on Symbol: -1 From: 2 To: 0 on Symbol: 0 From: 2 To: 0 on Symbol: 1 From: 3 To: 0 on Symbol: -1 From: 3 To: 0 on Symbol: 0 From: 3 To: 0 on Symbol: 1 になってしまいます。
お礼
BLUEPIXYさん 遅くなってすいません。 おかげで、できました。 ありがとうございました。