dポイントプレゼントキャンペーン実施中!

#include<stdio.h>
void F_open(FILE *fp);
main(){
FILE *fp;
F_open(fp);
fprintf(fp,"aaa\n");
}
void F_open(FILE *fp){
fp=fopen("aa.txt","w");
}

とすると、ファイルオープンはできるのですが
>fprintf(fp,"aaa\n");
で書き込もうとしたときにエラーになってしまいます。
解決策を教えていただきたいです。

A 回答 (3件)

あーそれは、


----
main(){
FILE *fp;
F_open(fp);
fprintf(fp,"aaa\n");
}
-----
の「fp」と、
-----
void F_open(FILE *fp){
fp=fopen("aa.txt","w");
}
-----
の「fp」がつながってないからです。
「F_openからmainにファイルポインタを渡す」必要があるのに、このプログラムでは、
「mainからF_openにファイルポインタを渡す」ことをしています。

対処策は、全部教えることになってしまいますが、

#include<stdio.h>
FILE * F_open(void);
main(){
FILE *fp;
fp = F_open(fp);
fprintf(fp,"aaa\n");
}
FILE * F_open(void){
return fopen("aa.txt","w");
}

とすれば動くはずです。

しかしそれよりも、ここで
F_open()関数を導入する意味はなく、
fopen関数をそのまま使った方が簡単だと思いますが?
(このあと機能を付け加えるというのならまた別です)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そのほうほうだとうまくいきました。

でも申し訳ないのですが、返り値としてファイルポインタを返さないでやる方法はないでしょうか?
実際は
void F_open(FILE *fp,int flag){
switch(flag){

case 1:
fp=fopen("test.txt","w");
break;

case 2:
fprintf(fp,"aaa\n");
break;

case 3:
fclose(fp);
break;
}
のような関数にしたいと思っています。
こういう関数は現実的に不可能なんでしょうか?

お礼日時:2005/07/26 21:50

今どき、C++に対応していないコンパイラを使っていることはないだろうから、C++限定でもう一つの答えを載せておきます。


C++なので、拡張子を*.cppにしてからコンパイルしてください。さもないとコンパイルエラーです。

void F_open(FILE **fp);

main(){
FILE *fp;
F_open(fp);
fprintf(fp,"aaa\n");
}

void F_open(FILE*& fp){
fp = fopen("aa.txt","w");
}

ポインタの参照渡しです。私的にはダブルポインタよりこっちの方が好きです。
なぜかというと、
> fp = fopen("aa.txt","w");
の部分を、main()関数側の
> F_open(fp);
と置き換えてそのまま動作するからです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
こういう方法もあるんですね。

お礼日時:2005/07/28 19:14

以下のようにする方法もあります。



void F_open(FILE **fp);
main(){
FILE *fp;
F_open(&fp);
fprintf(fp,"aaa\n");
}
void F_open(FILE **fp){
*fp=fopen("aa.txt","w");
}

サブ関数→コール元関数 へ引数で値を返すためには、
コール元関数側の変数のアドレスをサブ関数へ渡し、
そのアドレスに値を設定して返します。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
-izayoi-さんの方法で解決することができました。
ダブルポインタ?っていうやり方もあるんですね。
聞いたときはあるけど使ったことがありませんでした。

お礼日時:2005/07/26 23:11

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