ちょっと先の未来クイズ第4問

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;
}

A 回答 (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);
    • good
    • 0
この回答へのお礼

php504 さん

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

お礼日時:2009/10/07 10:10

回答2さんの


> ポインタのポインタになる理由は調べてみてください。
の理由がよくわからないのですが・・
別にfpの値が変化するわけではないので、
(変化するのはfpが指しているFILE構造体領域です)

kiroku(fo,n,i);
で呼び出して
void kiroku(FILE *fo,int ki1,int ki2){
でパラメータを受けて
fprintf(fo,"%d-%d\n",ki1,ki2);
で全然問題ないと思います。
    • good
    • 0
この回答へのお礼

Lchan0211 さん

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

お礼日時:2009/10/07 10:09

お疲れ様です。


貴方のソースをまともに動かそうと思うと以下になります。
ポインタのポインタになる理由は調べてみてください。

#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;
}
    • good
    • 0
この回答へのお礼

hiro_knighさん

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

お礼日時:2009/10/07 10:08

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

    • good
    • 0
この回答へのお礼

Trick--o--さん

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

お礼日時:2009/10/07 10:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報