Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

fscanfの使い方

285 views
Skip to first unread message

Ryosuke Miyoshi

unread,
Dec 7, 2000, 3:00:00 AM12/7/00
to
三好と申します.

以下のようなプログラムを作っていて,なぜか,core dumpしてしまい,悩んでいます.
gdbを見る限り,どうも,fscanfの使い方が悪いようなのですが,どこがわるいのか,
分かりません.

ちなみにosはvine 2.0でshellはbashです。

ソースの方には,エラーが出ているであろうか所に印をつけています.
どなたか,どこが悪いのかを,御指導下さい.

%gcc -Wall -g -o sample sample.c -lm
%./sample
core dumpしてしまう.
%gdb sample core
gdb sample core
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
Core was generated by `./sample'.
Program terminated with signal 11, セグメンテーション違反です.
Reading symbols from /lib/libm.so.6...done.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
#0 0x2ab2fd86 in _IO_vfscanf (s=0x8049ee8, format=0x8048c04 "%lf %lf %lf",
argptr=0x7ffff8f8, errp=0x0) at vfscanf.c:501
501 vfscanf.c: そのようなファイルやディレクトリはありません.
(gdb) where
#0 0x2ab2fd86 in _IO_vfscanf (s=0x8049ee8, format=0x8048c04 "%lf %lf %lf",
argptr=0x7ffff8f8, errp=0x0) at vfscanf.c:501
#1 0x2ab32e18 in __vfscanf (s=0x8049ee8, format=0x8048c04 "%lf %lf %lf",
argptr=0x7ffff8f8) at vfscanf.c:1320
#2 0x2ab32e3f in fscanf (stream=0x8049ee8, format=0x8048c04 "%lf %lf %lf")
at fscanf.c:31
#3 0x80486a8 in main () at sample.c:58

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include"common.h"
#include"eyenumber.h"


#define EYENUMBER 85

#define EYEX 0.000000
#define EYEY -2.951472
#define EYEZ 5.112099


typedef struct{

double vertex[3];
double dis;
int angle[2];
int number;


}EYE;

static EYE EyeData[8];

int main(void){

FILE *inp,*oup;
double vertex[3],vertex2[3],dis,v0,v1,v2;
int i,angle[2],number,j,k;


for(i=0;i<8;i++)
EyeData[i].dis=100.0;

if((inp=fopen("eyedata.txt","r"))==NULL){
printf("can't open eyedata.txt.\n");
exit(1);
}

oup=fopen("vertex.txt","w");


for(i=0;i<EYENUMBER;i++){

/**************この部分でエラーが出ている.*******************/
fscanf(inp,"%lf %lf %lf",&vertex[0],&vertex[1],&vertex[2]);
fscanf(inp,"%*f %*f %*f");
fscanf(inp,"%d %d %d",&angle[0],&angle[1],&number);


v0=vertex[0];
v1=vertex[1];
v2=vertex[2];

vertex2[0]=(v0-EYEX)*(v0-EYEX);
vertex2[1]=(v1-EYEY)*(v1-EYEY);
vertex2[2]=(v2-EYEZ)*(v2-EYEZ);

dis=sqrt(vertex2[0]+vertex2[1]+vertex2[2]);

for(j=0;j<8;j++){

if(EyeData[j].dis>=dis){

for(k=8;k>j;k--)
EyeData[k]=EyeData[k-1];

EyeData[j].vertex[0]=v0;
EyeData[j].vertex[1]=v1;
EyeData[j].vertex[2]=v2;
EyeData[j].angle[0]=angle[0];
EyeData[j].angle[1]=angle[1];
EyeData[j].number=number;
EyeData[j].dis=dis;

break;
}

else
continue;


}

}

for(i=0;i<8;i++)
printf("% f % f % f % f %d %d %d\n",\
EyeData[i].vertex[0],EyeData[i].vertex[1],\
EyeData[i].vertex[2],EyeData[i].dis,EyeData[i].angle[0],\
EyeData[i].angle[1],EyeData[i].number);


fclose(inp);
fclose(oup);

return(0);

}


Masao Seki

unread,
Dec 7, 2000, 6:44:56 PM12/7/00
to
関@神奈川と申します。

Ryosuke Miyoshi wrote: in <90nu78$nj$1...@news.telewaynet.ad.jp>
  ・


> 以下のようなプログラムを作っていて,なぜか,core dumpしてしまい,悩んでいます.
> gdbを見る限り,どうも,fscanfの使い方が悪いようなのですが,どこがわるいのか,
> 分かりません.
>
> ちなみにosはvine 2.0でshellはbashです。
>
> ソースの方には,エラーが出ているであろうか所に印をつけています.
> どなたか,どこが悪いのかを,御指導下さい.

デバッガは、強力な助手ですが、メッセージを常に鵜呑みにしては
いけません。配列の有効領域を越えた代入を行っった場合など、
原因とは掛け離れた現象として問題が顕在化する事は、それ程
珍しいことではありません。


> static EYE EyeData[8];
  ・
  ・


> for(k=8;k>j;k--)
> EyeData[k]=EyeData[k-1];

fscanfの使い方の問題と思い込まされていなければ、容易に発見
できそうなミスですね。


feofやferrorのチェックが入ってないのは、頂けません。
# 投稿の段階で省かれたのでしたら、今回の場合、まずかった
# ですね。

また、scanf、fscanfの使用は、慎重にした方が良い(と言うより
も、使ってはいけない)と言われているのは、ご存知ですか。
私は、fgetsで取り込んで、sscanfで処理する方法を愛用して
いますが、そんな事はあまり意味がないのでは、と云うような
議論も、過去に行われています。

--
関@神奈川
Masao Seki <ma-...@gb3.so-net.ne.jp>

terasima

unread,
Dec 8, 2000, 3:00:00 AM12/8/00
to
関@神奈川さん、御指摘、ありがとうございます。
結論を言うと、だめでした。

三好です。

関さんの指摘された箇所も完全に間違っていました。
そして、それを訂正したのですが、なぜか、core dumpして
しまいます。やはり、fscanfのせいなのかと思います。

私は、文字列が絡むときは、fgets+sscanfで処理するのですが、
そうでないときは面倒なので、fscanfでやってしまいます。

Ryosuke Miyoshi

unread,
Dec 8, 2000, 3:00:00 AM12/8/00
to
名前がterasimaになっていましたが、先ほど、出したものは
三好によるものです。人のものを使っている関係で・・・・。

ところで、新しい発見なのですが、最後のfcloseをコメントアウトすると、
動くことを発見しました。何か、気持ち悪いので、原因を究明したいとは
思っていますが。


遠藤 祐一

unread,
Dec 8, 2000, 10:56:42 AM12/8/00
to
遠藤と申します。

> 三好と申します.
>
> 以下のようなプログラムを作っていて,なぜか,core dumpしてしまい,悩んでいま
す.
> gdbを見る限り,どうも,fscanfの使い方が悪いようなのですが,どこがわるいの
か,
> 分かりません.
>

読み込みするファイル("eyedata.txt")に問題があるようです。

のように %lf 形式で読みこむデータは 1.1のように小数点を付けていますか?
ex.) 111.1 222.2 333.3 1.1 2.2 3.3 4 4 4
小数点を付けないとコアダンプします
ex.) 111 222 333 1.1 2.2 3.3 4 4 4

--
********************************
遠藤 祐一
E-MAIL : en...@fin.ne.jp

Masao Seki

unread,
Dec 8, 2000, 8:05:12 PM12/8/00
to
関@神奈川です。

遠藤 祐一 wrote: in <90r08q$20le$1...@nntp.fin.ne.jp>
  ・
  ・


> 読み込みするファイル("eyedata.txt")に問題があるようです。
>
> のように %lf 形式で読みこむデータは 1.1のように小数点を付けていますか?
> ex.) 111.1 222.2 333.3 1.1 2.2 3.3 4 4 4
> 小数点を付けないとコアダンプします
> ex.) 111 222 333 1.1 2.2 3.3 4 4 4

「%f」や「%lf」に、整数データを与えるのは、なんら問題ありません。

この辺の動作はfscanfもscanfも同じですから、簡単なテストプログラム
でも書いて、確認してみて下さい。

ちなみに、「%d」に対して、小数点付きのデータを食わせると、整数部分
だけ読み込んで、その時点で読み込みをやめてしまいますが。
ex)
int i = 10, j = 20, k = 30, n;
n = scanf("%*f %d %d %d", &i, &j, &k);
に対して、
1.2 3 4.5 6
を食わせると、n = 2, i = 3, j = 4になって、kは30のまま。


遠藤さんは、私が別記事で指摘した、配列の有効外領域への代入を
そのままにして、テストされているのではありませんか。それから、
開発環境は、VC++6.0 on Windows98辺りかな。

実は、私は初めにgcc2.95 on Solaris2.4(sparc)とVC++5.0 on Win95
で試したのですが、何事も起きなかったのですよ。
あれれと思いながら、念の為Vine Linux1.1で確認したら、見事に
core dumpしたと云う訳です。

私の記事にも書きましたが、システムの領域を壊すような事をすると
何処で何が起きるか分かりませんので、現象だけを見て、安易に原因
を決め付けると、痛い目をみる事になります。


それにしても、元記事の方、私の記事に「だめだった」とフォロー
されて、自己フォローとされた記事で、私の指摘と同じ項目を示して
解決したと報告されているのですが、それぞれでどんな修正をされた
のか、今一不可解です。

Ryosuke Miyoshi

unread,
Dec 8, 2000, 10:42:40 PM12/8/00
to
> それにしても、元記事の方、私の記事に「だめだった」とフォロー
> されて、自己フォローとされた記事で、私の指摘と同じ項目を示して
> 解決したと報告されているのですが、それぞれでどんな修正をされた
> のか、今一不可解です。
>
> --
> 関@神奈川
> Masao Seki <ma-...@gb3.so-net.ne.jp>


三好です.

すみません。本当,その通りでした.実は,最初の指摘で,
アルゴリズムのミスに気が付いてそっちの修正をしました。
それで駄目だったと言うことです。

関@神奈川さんは,少し,不愉快な思いをされたかもしれ
ません。すいませんでした。

ズバリ,関さんが指摘された通りでした。どうも,ありがとうございました.

Masao Seki

unread,
Dec 9, 2000, 12:19:34 AM12/9/00
to
関@神奈川です。

Ryosuke Miyoshi wrote: in <90s9ns$apl$1...@news.telewaynet.ad.jp>
  ・
  ・
> 関@神奈川さんは,少し,不愉快な思いをされたかもしれ
> ません。すいませんでした。

多少不愉快に感じたのは事実ですが、次の三好さんの一言で、
不愉快度の符号を反転させて、十倍した位の感謝の気持ちを
覚えました。


> ズバリ,関さんが指摘された通りでした。どうも,ありがとうございました.

投稿の内容には、自分なりに自信を持っているつもりですが、
質問されたご本人から、明確な結果報告が聞けるまでは、随分
不安な時間を過ごしているものです。
また、自分の投稿記事に対する、真の識者からの思いもよらぬ
指摘を、胸をドキドキ・ワクワクさせながら待つ気持ちは、
投稿してみなければ、味わえないでしょうね。 > ROM Onlyの方々

それに、馬鹿な投稿をしたくないと云う気持ちが、にわか勉強
をする大きなモチベーションとなっており、自分自身を成長さ
せる原動力となっております。

三好さんの今回の記事のおかげで、21世紀に向けて、ますます
頑張って行こうという気持ちが、湧いて来ました。

私こそ、どうもありがとうございました。

0 new messages