ここから本文です

空白区切りのテキストデータを読み込む方法?

sin********さん

2010/12/319:59:12

空白区切りのテキストデータを読み込む方法?

下記コードは、一文字以上の空白で区切られた数字の表でできたTextファイルを読み込み行列に格納するコードなのですが。
read_dataがどのように動いているのか、コードを眺めていてもよくわからない状態です。
下記コードを日本語にするとどのような動作をしているのでしょうか?

後、タブやカンマや空白区切りのデータを読み込むときの作法や方法にはどんなものがあるのでしょうか?


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);
}

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
717
回答数:
1

違反報告

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

biw********さん

2010/12/416:32:06

read_data本体は、読み込み処理自身はgetnum関数に丸投げして、自身はひたすら二次元配列に格納するだけのループ。

getnum関数は、“fscanf(datafile,"%81s%*[^ \t\n]",s)”が空白区切りの本体で、“%*[^ \t\n]”が、連続した「空白、タブ、改行以外」を読み捨てる動作を行っている。
標準で、scanf系はこれらの空白類を区切りとして勝手に区切って読み捨てるので、組み合わせで、空白区切りの文字列を読む事になる。

読んだ文字列が、想定する数値文字列かチェックして、strtod関数で数値変換し、最後に、途中で発生したエラーや変換漏れの文字やデーが範囲内かチェックして終了、だね。

さて、不明点は何処?

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

2010/12/10 12:02:14

ありがとうございます。
大体大雑把な動きは理解できました。

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

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

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

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

閉じる

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

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

閉じる