• ベストアンサー

fopen用の関数を作りたいです。

#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"); で書き込もうとしたときにエラーになってしまいます。 解決策を教えていただきたいです。

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

あーそれは、 ---- 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関数をそのまま使った方が簡単だと思いますが? (このあと機能を付け加えるというのならまた別です)

sin11
質問者

お礼

回答ありがとうございます。 そのほうほうだとうまくいきました。 でも申し訳ないのですが、返り値としてファイルポインタを返さないでやる方法はないでしょうか? 実際は 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; } のような関数にしたいと思っています。 こういう関数は現実的に不可能なんでしょうか?

その他の回答 (2)

  • buuchan1
  • ベストアンサー率31% (6/19)
回答No.3

今どき、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); と置き換えてそのまま動作するからです。

sin11
質問者

お礼

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

  • -izayoi-
  • ベストアンサー率45% (48/105)
回答No.2

以下のようにする方法もあります。 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"); } サブ関数→コール元関数 へ引数で値を返すためには、 コール元関数側の変数のアドレスをサブ関数へ渡し、 そのアドレスに値を設定して返します。

sin11
質問者

お礼

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

関連するQ&A