プロが教えるわが家の防犯対策術!

プログラムのことについてご質問します。
先日から以下のプログラムのことについて悩んでいます。
このプログラムは、テキストファイル(内容は「名前,成績」)を読み込んで、テキストファイル(内容は「名前,成績,偏差値」)を書きだすというものなのです。てか、そのつもりで作りました。
コンパイルの時は、エラーが出ないのですが、いざ起動してみると、プログラムが終了せず、書き出しも行われません。

#include<stdio.h>
#include<math.h>


int main(int argc,char *argv[]){
FILE *rfp;
FILE *wfp;
int nline = 0;
double score[100];
double sum_score = 0;
char name[100][256];
int i;
double heikinn;
double hensati[100];
double ga[100];
double g[100];
double gg=0;
double d=0;


if (argc != 3){
fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]);
return -1;
}

if ((rfp=fopen(argv[1],"r")) ==NULL){
fprintf(stderr,"%sが開けません\n",argv[1]);
return -1;
}

if ((wfp=fopen(argv[1],"w")) ==NULL){
fprintf(stderr,"%sが開けません\n",argv[2]);
return -1;
}

while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){
sum_score += score[nline];
nline ++;
}

heikinn=sum_score/nline;

for (i=0; i<=nline; i++){
ga[i]=(score[i]-heikinn);
g[i] = ga[i]*ga[i];
gg += g[i];
}


for (i=0; i<=nline; i++){
d= gg/(nline-1);
hensati[i]=10*ga[i]/sqrt(d)+50;
}
for(i=0; i<=nline; i++){
fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]);
}

fclose(wfp);
fclose(rfp);

return 0;
}
皆様のお力をおかりできないでしょうか?
よろしくお願いします。

「プログラムのことについてご質問します。」の質問画像

A 回答 (3件)

> if ((rfp=fopen(argv[1],"r")) ==NULL){


> if ((wfp=fopen(argv[1],"w")) ==NULL){

読み込みと書き込みで同じファイルを開こうとしています。
おそらく、いったんreadで開いた後、writeに変更されてエラーにはなってないのだと思われますが、

> while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){

ファイルはwriteモードなのでfscanfは入力を受け取ることが出来ないので、延々と待ち続けてるものと思われます。
    • good
    • 0
この回答へのお礼

ありがとうございます
計算式や下のほうのプログラムを意識するあまりまったく気づきませんでした

お礼日時:2010/06/10 11:38

デバッガとか無いの?


自分の作ったプログラムデバッグするのも、テクニック身につける一つなのですが。

>while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){

多分、ここのfscanfの正規表現はおかしい気がしますが、while()に入れてるせいでコンパイラが弾いてないんじゃ無いの?(あくまで、推測ですけど。)
    • good
    • 0
この回答へのお礼

早いお返事をいただきありがとうございます。 
疑問は、解決しました
デバッカはデバッグのことでした。
fscanfは入出力のプログラムの1つです。
拙い文でしたので 申し訳ありませんでした。

お礼日時:2010/06/10 11:42

とりあえず、


>while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){
>sum_score += score[nline];
>nline ++;
>}
ここのループの中で、nline,name[nline],score[nline]の各値をprintfしてみましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/06/10 11:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!