お世話になっております。
添付ファイルをご覧いただきたいのですが、他の関数内のようにファイル読み込み関数内にもコメントを付けたいのですが、どのように付けたら良いのかいまいちわかりません…;
while文以降、どのような処理を行っているのか教えていただきたいです;
他の関数内のコメントもおかしな部分がありましたら教えていただけると幸いです…
ソース内のコメントについて
Re:ソース内のコメントについて
if(strcmp(tmp,"\n")==0){ continue; }これは読み込んだデータが改行文字だったら次の行を読み込むようにするためです。
(write関数にfprintf(fp,"\n");とあるので)
s = strchr(tmp,'\n'); if(s != NULL){ tmp[s-tmp]='\0'; }これはtmpには改行文字が含まれているので、'\n'が見つかったら'\0'に置き換えるということをしています。
switch(cnt%5){ case 0: strcpy(data.name,tmp); break; case 1: strcpy(data.yubin,tmp); break; case 2: strcpy(data.add,tmp); break; case 3: strcpy(data.tel,tmp); break; case 4: if(strcmp(tmp,man)==0){ strcpy(data.sei,"1"); }else{ strcpy(data.sei,"2"); } break; } if(++cnt%5==0){ ++i; }
switch文はcnt%5の値によって読み込んだデータを入れる変数を変えています。
(名前から性別まで読み込んだら、また名前から始まる)
if(++cnt%5 == 0)は、cntの値を増やして5で割った余りが0のとき
つまりcnt%5の値が0から4まで変化し、名前から性別まで読み込んだら、
一人分のデータが読み込めたということなので、++iによってiの値を増やしています。(iは人数に対応しています)
最後まで読み込んだらreturn i;によって読み込んだ人数の値を返してます。
説明力不足ですがこんな感じでわかりますかね・・・^^;
Re:ソース内のコメントについて
コメントというものは、プログラミング言語や標準ライブラリの知識を補完するためのものではありません。
このソースの場合、read関数が何をやっているのかはコードを見れば分かりますから、何をやっているかについては、せいぜい関数ヘッダがあれば十分かと思います(それさえも必須ではありません)。
では、どんなコメントが必要かというと、コードを見て疑問に思う箇所に関して、そのような仕様または実装にした理由です。
・例えば、引数pathはconst char*ではなくchar*になっていますが、その理由は何なのか?
・while文の中でstrcpyを使って入力内容を構造体に格納していますが、(バッファオーバーランのリスク等を回避し)安全性を担保するための根拠は何か?
・cntとiを分けている理由は何か?
といったことをコメントにするとよいでしょう。
また、
・fopenの失敗はファイルが存在しない場合だけなのか?
・fcloseに対して、/* ファイルを閉じる */といった自明なコメント付けているのはなぜか?
といったことについてもコメントがあった方がよいかもしれません。
このソースの場合、read関数が何をやっているのかはコードを見れば分かりますから、何をやっているかについては、せいぜい関数ヘッダがあれば十分かと思います(それさえも必須ではありません)。
では、どんなコメントが必要かというと、コードを見て疑問に思う箇所に関して、そのような仕様または実装にした理由です。
・例えば、引数pathはconst char*ではなくchar*になっていますが、その理由は何なのか?
・while文の中でstrcpyを使って入力内容を構造体に格納していますが、(バッファオーバーランのリスク等を回避し)安全性を担保するための根拠は何か?
・cntとiを分けている理由は何か?
といったことをコメントにするとよいでしょう。
また、
・fopenの失敗はファイルが存在しない場合だけなのか?
・fcloseに対して、/* ファイルを閉じる */といった自明なコメント付けているのはなぜか?
といったことについてもコメントがあった方がよいかもしれません。
Re:ソース内のコメントについて
質問とは関係ないけど気付いた点、、、
終端文字の分の確保を忘れています。
↓のようにしましょう。
#define NAME 17 /* 氏名の最大文字数 */
(略)
typedef struct jusyoroku {
char name[NAME + 1];
(略)
}Jusyoroku;
終端文字の分の確保を忘れています。
↓のようにしましょう。
#define NAME 17 /* 氏名の最大文字数 */
(略)
typedef struct jusyoroku {
char name[NAME + 1];
(略)
}Jusyoroku;
Re:ソース内のコメントについて
皆様、回答ありがとうございます^^
皆様の回答を参考にしてこれからソースにコメントの追加や修正等していきたいと思います!
ありがとうございました^^
皆様の回答を参考にしてこれからソースにコメントの追加や修正等していきたいと思います!
ありがとうございました^^