- ベストアンサー
ある関数のソースがわかりません。
KOKUGO=100 SUUGAKU=80 RIKA=0 SYAKAI=60 というファイルを取得して数字だけ構造体に渡す関数のソースです。 define KOKUGO 3; define SUUGAKU 2; define RIKA 1; define SYAKAI 2; 構造体は typedef struct{ char koku[KOKUGO +1]; char suu[SUUGAKU +1]; char rika[RIKA + 1]; char sya[SYAKAI + 1]; }data; です。 全体ではデータを読み取ってcsv形式で出力するプログラムなんですが main関数、出力関数はちょっと省きます。 int Readfile(data *txtfile, char *ptxt) { FILE *fp; char *fullcode = NULL; char search = '='; char buff[30] = {'\0'}; int enum[4] = {'\0'}; int err = 0; char *rtxt = NULL; /*ファイルオープン*/ fp = fopen(ptxt, "r"); if(fp == NULL){ puts("オープンエラー"); return(1); } /*ファイル読み取り*/ while(1){ /*データを一行ずつ読み取り*/ rtxt = fgets(buff, sizeof(buff), fp); if(rtxt == NULL){ break; } /*データ名確認*/ if(strncmp(buff, "KOKUGO=", 7) == 0){ ••••••••••• (1) /*'='を含むデータ確認*/ fullcode = strchr(buff, search); /*'='より後ろの点数確認*/ fullcode += 1; /*点数桁数確認*/ if(strlen(fullcode) == KOKUGO + 1){ /*構造体に点数のみ格納*/ strncpy(txtstr -> koku, fullcode, KOKUGO); enum[0] += 1; }else{ puts("データが違います") return(1); } }else if(strncmp(buff, "SUUGAKU=", 8) == 0){ fullcode = strchr(buff, search); fullcode += 1; if(strlen(fullcode) == SUUGAKU + 1){ strncpy(txtstr -> suu, fullcode, SUUGAKU); enum[1] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "RIKA=", 5) == 0){ fullcode = strchr(buff, search); fullcode += 1; if(strlen(fullcode) == RIKA + 1){ strncpy(txtstr -> rika, fullcode, RIKA); enum[2] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "SYAKAI=", 7) == 0){ fullcode = strchr(buff, search); fullcode += 1; if(strlen(fullcode) == SYAKAI + 1){ strncpy(txtstr -> sya, fullcode, SYAKAI); enum[3] += 1; }else{ puts("データが違います") return(1); } } } for(err = 0; err < 4; err ++){ if(enum[err] != 1){ puts("データが違います"); return(1); } } /*ファイルを閉じる*/ fclose(fp); return(0); } という風に書いてあるんですが(1)の部分で7文字比較して等しければ 次の/*'='を含むデータ確認*/に進むと思うんですが等しくなければ どういう処理が行われ、どこに進むのかわかりません。 基本的にこの無限ループの流れがわかりません。 このソースの読み方を教えてください。 友達が以前書いたソースなんですが聞いてももうわからないらしくて・・・。 すいませんが、勉強し始めたばかりなので詳しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイルを一行ずつ読み込み、読み込んだ文字列が、"KOKUGO=", "SUUGAKU=", "RIKA=", "SYAKAI="のどの文字列を含んでいるかを以下の部分で比較しています。 if(strncmp(buff, "KOKUGO=", 7) == 0){ (1) } else if(strncmp(buff, "SUUGAKU=", 8) == 0){ (2) } else if(strncmp(buff, "RIKA=", 5) == 0){ (3) } else if(strncmp(buff, "SYAKAI=", 7) == 0){ (4) } 最初のif文で"KOKUGO="と比較 -> 等しければ、(1)の処理 -> 等しくなければ、次のelse if文で"SUUGAKU="と比較 -> 等しければ、(2)の処理 -> 等しくなければ、次のelse if文で"RIKA="と比較 -> 等しければ、(3)の処理 -> 等しくなければ、次のelse if文で"SYAKAI="と比較 -> 等しければ、(4)の処理 -> 等しくなければ、何もせず終了 といった感じです。 正直、if文は、初歩中の初歩です。 人のソースを読む前に、もう少し基本を勉強すべきです。
その他の回答 (2)
- LegaC2
- ベストアンサー率52% (224/428)
> 最初にKOKUGO=100を読み込んで比較して行き、 > 最後まで等しくなければ、SUUGAKU=80を読み込み、 > 比較して行く、ということでしょうか? 違います。 KOKUGO=100を読み込んで比較して行き、最後まで等しくなくても、途中で等しくても、次のSUUGAKU=80を読み込み、比較していく、ということです。 先ほども書きましたが、基礎があまりにも判っていない感じがします。 ABCを知らずに、英文を読んでいるような感じです。 また、参考にしているコードはあまり良いコードだとは思えませんし、No.2さんも言われている通り、コンパイルが通るとはとても思えません。 基礎をもう少し勉強し、その後、もう少し綺麗なソースコードで勉強されることをお勧めします。
お礼
かなり初歩的な事をどうもありがとうございました! 参考書買って勉強します。
- asuncion
- ベストアンサー率33% (2127/6289)
> define KOKUGO 3; > define SUUGAKU 2; > define RIKA 1; > define SYAKAI 2; これだとコンパイルできないです。 曲がりなりにでも動いているソースコードを提示するときは、 コピー&ペーストして、そっくりそのまま見せてください。
補足
ありがとうございました。やっと整理できてきました。 最初にKOKUGO=100を読み込んで比較して行き、 最後まで等しくなければ、SUUGAKU=80を読み込み、 比較して行く、ということでしょうか? どれか等しくないデータがあればfor文でエラーが出るんですね。