• ベストアンサー

C言語_関数宣言_fprintfです!お願いします!!

C言語(C言語_関数宣言_fscanf)に関する質問です。 main関数とは別に新しく自分で関数を定義しました。 (keisan関数とします。) keisan関数の中に「fprintf」を用いたのですが上手くいきません。 (printfは通常通りに働きます。) どのような理由が考えられるでしょうか? (グローバル変数などの理由でしょうか?) どうか,ご指導お願いします!! #include <stdio.h> void kiroku(int ki1,int ki2){ printf("%d-%d\n",ki1,ki2); fprintf(fo,"%d-%d\n",ki1,ki2); /*↑このfprintfです*/ } int main(){ char *fnmo="kiroku.txt"; FILE *fo; int n,i; // open files. fo = fopen(fnmo,"w"); if(fo==NULL) { printf("NG\n"); return 0; } // read and store. n=1; i=2; kiroku(n,i); // close files. fclose(fo); return 0; }

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

(グローバル変数などの理由でしょうか?) いわゆる変数のスコープ(有効範囲)の問題ですね。 関数内で宣言された変数はその関数内でしか有効でありません。(実際はもっと細かくブロック内のみで有効ですが) main( ){ }で宣言されたFILE *fo;はmain( ){ }の外では使えません。 グローバル変数はその有効範囲がソースファイル全体ということになります。 FILE *fo; をグローバル変数にすればできます。 引数で渡す場合も普通のポインタで問題ないのではないでしょうか。 void kiroku(FILE *fo,int ki1,int ki2){ printf("%d-%d\n",ki1,ki2); fprintf(fo,"%d-%d\n",ki1,ki2); } int main(){ kiroku(fo,n,i);

mykitune
質問者

お礼

php504 さん 無事コンパイルできました! ありがとうございました。 m(_ _)m

その他の回答 (3)

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.3

回答2さんの > ポインタのポインタになる理由は調べてみてください。 の理由がよくわからないのですが・・ 別にfpの値が変化するわけではないので、 (変化するのはfpが指しているFILE構造体領域です) kiroku(fo,n,i); で呼び出して void kiroku(FILE *fo,int ki1,int ki2){ でパラメータを受けて fprintf(fo,"%d-%d\n",ki1,ki2); で全然問題ないと思います。

mykitune
質問者

お礼

Lchan0211 さん 無事コンパイルできました! ありがとうございました。 m(_ _)m

回答No.2

お疲れ様です。 貴方のソースをまともに動かそうと思うと以下になります。 ポインタのポインタになる理由は調べてみてください。 #include <stdio.h> void kiroku(FILE **fo,int ki1,int ki2){ printf("%d-%d\n",ki1,ki2); fprintf(*fo,"%d-%d\n",ki1,ki2); /*↑このfprintfです*/ } int main(){ char *fnmo="kiroku.txt"; FILE *fo; int n,i; // open files. fo = fopen(fnmo,"w"); if(fo==NULL) { printf("NG\n"); return 0; } // read and store. n=1; i=2; kiroku(&fo,n,i); // close files. fclose(fo); return 0; }

mykitune
質問者

お礼

hiro_knighさん 無事コンパイルできました! ありがとうございました。 m(_ _)m

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

kirokuの中でfoが定義されていない?

mykitune
質問者

お礼

Trick--o--さん 無事コンパイルできました! ありがとうございました。 m(_ _)m

関連するQ&A

  • C言語_関数_構造体です!教えて下さい!!

    <C言語です> 新しく関数を宣言した中で構造体を使用したいのですが, 上手くいきません。 ご指導宜しくお願い致します!! /*data.csv*/ ------------ 鈴木,21 田中,22 佐藤,23 ------------ 以下プログラム ------------ #include <stdio.h> /*構造体の宣言*/ typedef struct list{ char name[80]; int age; }list1; /*関数の宣言*/ void kiroku(FILE *fo,int ki1){ if(ki1==1) fprintf(fo,"%sの歳は%dです。",data[ki1].name,data[ki1].age); else if(ki==2) fprintf(fo,"%sの歳は%dです。",data[ki2].name,data[ki2].age); else fprintf(fo,"%sの歳は%dです。",data[2].name,data[2].age); } int main(){ char *fin="data.csv"; char *fnmo="kiroku.txt"; FILE *fi,*fo; list1 data[10]; int i,k,r; char ss[80]; //open files. fi=fopen(fin,"r"); fo=fopen(fnmo,"w"); //read r=0; while(fscanf(fi,"%[^,],%d",ss,&k)!=EOF){ strcpy(data[r].name,ss); data[r].age=k; r++; } i=1; /*関数の実行*/ kiroku(fo,i); // close files. fclose(fi); fclose(fo); return 0; }

  • C言語から質問です。

    C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、  ANSWER=(double)(int型の変数)/(int型の変数);    と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語の関数設計について

    以下のようなプログラムがあり、(1)~(5)の部分を関数化せよという問題なのですが成功しません。どなたか関数化してください。できれば解説付きでよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define K_INT 32 #define K_DEC 32 /*小数用*/ int main(void){ double dd; int bi[K_INT], bd[K_DEC]; int ki,kd,q,i; /*--------------(1)入力---------------------------*/ printf("10進数値(少数含): "); scanf("%lf", &dd); q = (int)floor(dd); i = 0; /*---------------ここまで(1)----------------------*/ /*---------------(2)整数部の変換------------------*/ while (q > 0){ bi[i] = q % 2; q= q/2; i++; } /*----------------ここまで(2)---------------------*/ ki = i; /*--------------(3)整数部の表示-------------------*/ for(i=ki-1; i>=0; i = i-1) printf("%d", bi[i]); /*---------------ここまで(3)----------------------*/ /*---------------(4)少数部の変換------------------*/ dd = dd - floor(dd); i = 1; while ((i < K_DEC) && (dd > 0)){ dd = dd * 2.0; bd[i] = (int)floor(dd); dd = dd - floor(dd); i++; } /*--------------ここまで(4)-----------------------*/ kd = i-1; printf("."); /*--------------(5)少数部の表示-------------------*/ for(i=1; i <= kd; i++) printf("%d",bd[i]); /*--------------ここまで(5)-----------------------*/ printf("\n"); return 0; }

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

  • c言語なのですが

    c言語なのですが #include<stdio.h> main() { int a; printf("整数を5回足し算する\n"); scanf("%d %d",&a); printf("a*5=%d\n",a*5); return(0); } でエラーが起こります どこを修正すればいいのでしょうか

  • c言語 

    答えを0にするこまち算のプログラムを組んでみたのですが、ここからどうしても進まなくなってしまいました。 自分ではいけるかなと思ったのですが、9-8-7+65-4321=9など答えがありえない数になってしまいます。 どこがいけないか教えてください。むしろ最初から組み直した方がよいのでしょうか… #include <stdio.h> int cul(); int num[9] ={9,8,7,6,5,4,3,2,1}; int total;/**/ int kigou[8]={0,0,0,0,0,0,0,0}; int main(){ for(kigou[0]=0;kigou[0]<3;kigou[0]++){ for(kigou[1]=0;kigou[1]<3;kigou[1]++){ for(kigou[2]=0;kigou[2]<3;kigou[2]++){ for(kigou[3]=0;kigou[3]<3;kigou[3]++){ for(kigou[4]=0;kigou[4]<3;kigou[4]++){ for(kigou[5]=0;kigou[5]<3;kigou[5]++){ for(kigou[6]=0;kigou[6]<3;kigou[6]++){ for(kigou[7]=0;kigou[7]<3;kigou[7]++){ keisan(); } } } } } } } } return 0; } int keisan(){ int n =0; int flag = 0; int t = 0; int i = 0; total = num[0]; /* for (n=0;n<9;n++) printf("kigou[%d] == %d",n,kigou[n]);確かめ*/ for(;n<8;n++){ if(kigou[n] == 0 && n == 0){ total = total * 10 + num[n+1]; for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ total = total * 10 + num[n+flag+1]; } n = n + flag; } flag=0; if(kigou[n]!= 0){ for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ t = num[n+1] * 10 + num[n+flag+1]; } n = n+ flag; total = total + t; } } /*0になる計算式の表示*/ kigou[8]=2;/*表示しないために空白を入れる*/ if(total==0){ for(i=0;i<9;i++){ printf("%d",num[i]); if(kigou[i]==0) printf("+"); if(kigou[i]==1) printf("-"); if(kigou[i]==2) printf(""); } printf("=%d\n",total); } return 0; }

  • 現在、C言語を習っています。

    現在、C言語を習っています。 今、関数を勉強しているんですがわからない文があるので正解の文を教えてください。 #include <stdio.h> int main (void) { int a=123; doubke b=4.5; printf("%d\n○○" ,a,b); return 0; } ○に入る言語や文が間違っていたら教えてください。

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

専門家に質問してみよう