- ベストアンサー
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; }
- みんなの回答 (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);
その他の回答 (3)
- Lchan0211
- ベストアンサー率64% (239/371)
回答2さんの > ポインタのポインタになる理由は調べてみてください。 の理由がよくわからないのですが・・ 別にfpの値が変化するわけではないので、 (変化するのはfpが指しているFILE構造体領域です) kiroku(fo,n,i); で呼び出して void kiroku(FILE *fo,int ki1,int ki2){ でパラメータを受けて fprintf(fo,"%d-%d\n",ki1,ki2); で全然問題ないと思います。
お礼
Lchan0211 さん 無事コンパイルできました! ありがとうございました。 m(_ _)m
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
お疲れ様です。 貴方のソースをまともに動かそうと思うと以下になります。 ポインタのポインタになる理由は調べてみてください。 #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; }
お礼
hiro_knighさん 無事コンパイルできました! ありがとうございました。 m(_ _)m
- Trick--o--
- ベストアンサー率20% (413/2034)
kirokuの中でfoが定義されていない?
お礼
Trick--o--さん 無事コンパイルできました! ありがとうございました。 m(_ _)m
お礼
php504 さん 無事コンパイルできました! ありがとうございました。 m(_ _)m