ここから本文です

ファイル読み込みの構文が分からない

sin********さん

2010/12/319:53:05

ファイル読み込みの構文が分からない

下記は、1文字以上の空白区切りのテキストを読み込み、先頭からデータを取得するプログラムなのですが。
何故上手く動くのか理解できません。

下記コードは呼ぶたびに新しいデータを取得してくれるようなのです。
下記コードを日本語で説明するとどのような実行が行われているのでしょうか?


double getnum(FILE *datafile)
{
double x;
char *rest,s[83];
do{
if(fscanf(datafile,"%81s%*[^ \t\n]",s)!=1)
return READERROR;
}while(strchr("0123456789+-.",s[0])==NULL);
if(s[0]=='.' && s[1]=='\0') return MISSING;
s[81]='?';s[82]='\0';x=strtod(s,&rest);
if(errno==0 && *rest=='\0' && fabs(x)<=0.97E+37)
return x;
errno=0;
return READERROR;
}



呼び出し側
int read_data(FILE *datafile,int n,int m,matrix x)
{
int i,j,err;
unsigned long missings;
double t;
err=0;
missings=0;
for(i=0;i<n;i++) for(j=0;j<m;j++){
if(err){x[i][j]=READERROR;continue;}
t=getnum(datafile);x[j][i]=(SCALAR)t;
if(! missing(t)) continue;
if(readerror(t)){
fprintf(stderr,"読み込みエラー(%d,%d)\n",i+1,j+1);
err=2;
}else missings++;
}
fprintf(stderr,"読み込み終了 (欠測地 %lu 個)\n",missings);
return err | (missings !=0);
}

閲覧数:
194
回答数:
1

違反報告

ベストアンサーに選ばれた回答

pis********さん

2010/12/417:41:08

> if(fscanf(datafile,"%81s%*[^ \t\n]",s)!=1)

"%81s" が初めに空白文字をスキップしてワードを s に返します。ただ %* 以降は無駄の気もするけど。

> }while(strchr("0123456789+-.",s[0])==NULL);

s の先頭文字が上記の文字以外なら繰り返し。要は数値が出たら do loop 終了

> if(s[0]=='.' && s[1]=='\0') return MISSING;

"." で MISSING, EOF や数値に問題があるか 81 文字以上なら READERROR
EOF は scanf() の戻り値、strtod() で変換できない文字があれば rest で分かる

あとは read_data() で n*m行列に設定してる。"." の位置は欠測地ということらしく missings++ してるけど、正常値をわざわざ

> if(! missing(t)) continue;

と continue してるのはちょっと見みくい

質問した人からのコメント

2010/12/10 12:01:26

ありがとうございます。
少し細かい挙動が分からなかったですが大体は分かりました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる