- 締切済み
ファイルポインタのヘッダーファイルの配置について
分割コンパイルをしている別ファイルの別関数から、同じファイルポインタ(main関数でfopen済み)に出力(fprintf)は可能でしょうか? 可能な場合、 1.ファイルポインタをexternで宣言 2.ファイルポインタをヘッダファイル内で宣言 3.その他方法 どの方法で実現できるのでしょうか? サンプルコード等書いていただけたら助かります。 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
NO.2の回答に間違いがありました --- sample2.c --- #include "sample.h" void myout( void ) { int i = 0; for( i = 0; i;< 20; i++ ) { //fprintf( fp, "i = %d\n", i ); fprintf( fpout, "i = %d\n", i ); } }
- php504
- ベストアンサー率42% (926/2160)
個人的には引数で渡す方が好きです --- sample1.c --- void myout( FILE* ); int main( void ) { FILE *fpout; if ( NULL != ( fpout = fopen( "ファイルパス", "w") ) { myout( fpout ); fclose( fpout ); } return 0; } --- sample2.c --- void myout( FILE *fp ) { int i = 0; for( i = 0; i;< 20; i++ ) { fprintf( fp, "i = %d\n", i ); } }
- php504
- ベストアンサー率42% (926/2160)
グローバル変数なら引数にする必要はないですね --- sample.h --- #include <stdio.h> /* ファイルポインタの宣言 */ extern FILE* fpout; void myout( void ); --- sample1.c --- #include "sample.h" /* ファイルポインタの実体 */ FILE *fpout; int main( void ) { if ( NULL != ( fpout = fopen( "ファイルパス", "w") ) { myout( ); fclose( fpout ); } } --- sample2.c --- #include "sample.h" void myout( void ) { int i = 0; for( i = 0; i;< 20; i++ ) { fprintf( fp, "i = %d\n", i ); } }
- redfox63
- ベストアンサー率71% (1325/1856)
可能ですよ --- sample.h --- #include <stdio.h> /* ファイルポインタの宣言 */ extern FILE* fpout; void myout( FILE* fp ); --- sample1.c --- #include "sample.h" /* ファイルポインタの実体 */ FILE *fpout; int main( void ) { if ( NULL != ( fpout = fopen( "ファイルパス", "w") ) { myout( fpout ); fclose( fpout ); } } --- sample2.c --- #include "sample.h" void myout( FILE *fp ) { int i = 0; for( i = 0; i;< 20; i++ ) { fprintf( fp, "i = %d\n", i ); } }
補足
redfox63さん、php504さん早速のご回答ありがとうございます! 教えていただいた方法で実現できました! 知識不足のため理解できていない部分があるのですが、 ファイルポインタ変数に限らず、2つ以上のファイルが使用するグローバル変数をヘッダファイルで宣言するには、 1.externでヘッダファイルに宣言 2.変数を最初に使用するファイル内でグローバル変数として宣言 3.変数を使用するファイルすべてでヘッダファイルをインクルード という認識で合っていますでしょうか? もう1点、 sample1.c ではFILE *fpout と extern FILE *fpoutの2つが宣言されてい事になりますが、1つのファイル内でFILE *fpoutとextern FILE *fpoutを宣言しても特に問題ないという認識で合っていますでしょうか? ご回答に質問を重ねてしまい申し訳ないのですが、この機会に理解を深めたいと思います。 よろしくお願いいたします。