ページ 11

値の読み取り関数

Posted: 2010年11月03日(水) 15:57
by sk
skです。よろしくお願いします。
画像のPGMファイルから値を読み取る関数が以下のように作られています。

/*********************
値読み取り関数
*********************/
void getoneword(FILE *fp, char *word)
{
fscanf(fp, "%s", word);
if(word[0]=='#'){
while(word[0]!=10){
word[0]=(int)fgetc(fp);
}
fscanf(fp, "%s", word);
}
}

このifとwhileがそれぞれどのように処理されているのか良く分かりません。
(特に'#'は何を示しているのか。)
どなたかご教授よろしくお願い致します。

Re:値の読み取り関数

Posted: 2010年11月03日(水) 16:27
by Poco
PGMファイルは行頭に#があった場合、その行はコメントとみなします。
上記プログラムは、行頭に#があった場合、改行コード(\n)まで読み飛ばす処理です。

Re:値の読み取り関数

Posted: 2010年11月03日(水) 17:27
by sk
>>ぽこさん
ご教授有難うございます。

void getoneword(FILE *fp, char *word)
{
fscanf(fp, "%s", word); //ここは値(コメント以外)を読み込む
if(word[0]=='#'){ //もしコメントがあったら
while(word[0]!=10){  
word[0]=(int)fgetc(fp);
}
fscanf(fp, "%s", word);//改行コードまで読み飛ばす
}
}

といった感じでしょうか?
しかしwhileとfgetcの部分は一体何を示しているのでしょうか?
int型にキャストしている理由もよくわかりません。
質問がおおくなって申し訳ございません。

Re:値の読み取り関数

Posted: 2010年11月03日(水) 20:00
by Poco
> しかしwhileとfgetcの部分は一体何を示しているのでしょうか?

改行コードまで読み飛ばしている部分です。

Re:値の読み取り関数

Posted: 2010年11月03日(水) 20:53
by sk
>>ぽこさん
自分で調べてみたらキャストした理由がわかりました!
ヒントというかほぼ答えでしたね笑
有難うございました。

Re:値の読み取り関数

Posted: 2010年11月04日(木) 03:15
by フリオ
ちょっと気になったので、
 
>上記プログラムは、行頭に#があった場合、改行コード(\n)まで読み飛ばす処理です。
 "改行まで読み飛ばす"ことを意図しているのは推測出来ますが、
提示されたコードだけでは、"文字コードが 10 の文字まで読み飛ばす"であり、
それが改行であると断定できないのでは?
 
>自分で調べてみたらキャストした理由がわかりました!
 fgetcの戻り値はintなのにそれをわざわざintにキャストしている理由は何なのでしょうか? 画像

Re:値の読み取り関数

Posted: 2010年11月04日(木) 22:20
by Poco
> >上記プログラムは、行頭に#があった場合、改行コード(\n)まで読み飛ばす処理です。
>  "改行まで読み飛ばす"ことを意図しているのは推測出来ますが、
> 提示されたコードだけでは、"文字コードが 10 の文字まで読み飛ばす"であり、
> それが改行であると断定できないのでは?

Cの仕様からは断定できません。
私の経験で断定しているだけです。