• ベストアンサー

HPの例題について

入力をscanfではなくfgetsを用いての入力で行いたいのですが、いまいち方法が分かりません。 いろいろ試してみたのですが上手くいかないのでヒントをいただけないでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aid-u
  • ベストアンサー率75% (22/29)
回答No.5

fgetsとsscanfを利用する方法があります。 (1)fgetsにて1行のデータを読み込む (2)sscanfにて(1)のデータの格納域から個々のデータを取得する sscanfはscanfの標準入力から読み込むデータの代わりに文字列を与え、 その文字列からデータを取得する関数です。

teru3128
質問者

補足

なんとか出来ました!!!ありがとうございます。 sscanfは便利ですね。今度使ってみます。

その他の回答 (4)

回答No.4

fgetsやfscanfなど先頭にfが付くものはファイルからの入力ですね。。 ですのでコンソール画面からの入力はgetsになります。。 fgets http://msdn.microsoft.com/ja-jp/library/c37dh6kf.aspx gets http://msdn.microsoft.com/ja-jp/library/2029ea5f(VS.80).aspx

teru3128
質問者

お礼

getsはバッファオーバーの危険があるので使いたくないです。 fgetsでも3番目の引数をstdinにすれば標準入力できると思うのですが。

回答No.3

textファイルの構成にもよるんですが [test.txt](空白はタブ) itou   55.4   169.6 kato   75.2   175.3 sato   74.3   191.0 goto   65.1   180.4 のような構成であるとfgegsで読み込んだ際に itou   55.4   169.6の一つの文字列として読み込まれます。 精密にはitou\t55.4\t169.6\nの文字列として読み込まれます。 ですので読み込んだ文字を分割して構造体のメンバに格納すれば できますけど・・・・素直にscanf使った方が楽ですよ fgetsでやった例として 演習15-4-1の解答例↓ http://www9.plala.or.jp/sgwr-t/c/A/rei15-41.html のソースに新たに<stdlib.h>をインクルードして main関数を以下に変えて int main( void ) { FILE *fp; char buf[40]; struct list sintai[NINZUU+1]; int i=0; fp=fopen("test.txt","r"); while(fgets(buf , 30 , fp)!=NULL){ my_strcpy(&sintai[i++] , buf); } fclose(fp); sintai[i].taijyu = -1; /* ストッパーの設定 */ sintai[i].sincyou = -1; /* ストッパーの設定 */ print_dt( sintai ); /* データ表示 */ return 0; } 最後に↓の関数を付け加える void my_strcpy(struct list *sp , char *str) { int i , j; char buf[3][20]; for(i=0;i<3;i++){ for(j=0 ; *str!='\t' && *str!='\n'; j++){ buf[i][j]=*str++; } buf[i][j]='\0'; if(i<2){*str++;} } strcpy(sp->name,buf[0]); sp->taijyu=atof(buf[1]); sp->sincyou=atof(buf[2]); } テキストの内容は先頭の構成で。 汚いソースかもしれないけどお許しお・・・・

teru3128
質問者

お礼

コードの提示ありがとうございます。 ただテキストファイルを読み込む訳ではないのです。 もしかしたら私が勘違いしているのかもしれませんが^^; その場合はすみません。

回答No.2

A NO1です、質問を勘違いしていました。 fgetsを用いた場合 textファイルの内容 78 86 56 77 47 63 94 37 50 74 -1 #include <stdio.h> #include <stdlib.h> //atoi typedef struct point{ int max; int min; double average; }POINT; void scanner(FILE **fp , int *ten) { char buf[30]; while(1){ fgets(buf,20,*fp); *ten = atoi(buf); //atoiで文字列を数値に変換してtenに代入後次のポインタへ移動 if(*ten==-1){break;} *ten++; } } POINT seiseki_shutoku(int *ten) { int sum=0; POINT po; po.max=po.min=*ten; while(*ten!=-1){ if(*ten>po.max){po.max=*ten;} else if(*ten<po.min){po.min=*ten;} sum += *ten; *ten++; } po.average = (double)sum/10; return po; } int main(void) { int ten[11]; FILE *fp; POINT po; if( (fp=fopen("test.txt","r"))==NULL){ printf("File Not Found\n"); return 1; } scanner(&fp , &ten[0]); fclose(fp); po=seiseki_shutoku(&ten[0]); printf("最高点=%d\n",po.max); printf("最低点=%d\n",po.min); printf("平均点=%.1lf\n",po.average); return 0; } おまけに先ほどの解答では平均値の代入時にキャスト忘れてました。

teru3128
質問者

お礼

回答ありがとうございました。

回答No.1

#include <stdio.h> typedef struct point{ int max; int min; double average; }POINT; POINT seiseki_shutoku(int *ten) { int sum=0; POINT po; po.max=po.min=*ten; while(*ten!=-1){ if(*ten>po.max){//代入処理} else if(*ten<po.min){//代入処理} sum += *ten; //合計を求める *ten++; //次の要素のポインタへ(ten[0]のときten[1]へ) } po.average = sum/10; //合計を10で割る return po; } int main(void) { int ten[11]={78,86,56,77,47,63,94,37,50,74,-1}; POINT po; po=seiseki_shutoku(&ten[0]); //ten[0]のアドレスを渡す printf("最高点=%d\n",po.max); printf("最低点=%d\n",po.min); printf("平均点=%.1lf\n",po.average); return 0; } こんな感じです。

teru3128
質問者

お礼

ありがとうございます。

関連するQ&A

専門家に質問してみよう