アプリ版:「スタンプのみでお礼する」機能のリリースについて

分割コンパイルをしている別ファイルの別関数から、同じファイルポインタ(main関数でfopen済み)に出力(fprintf)は可能でしょうか?
可能な場合、
1.ファイルポインタをexternで宣言
2.ファイルポインタをヘッダファイル内で宣言
3.その他方法
どの方法で実現できるのでしょうか?
サンプルコード等書いていただけたら助かります。

よろしくお願い致します。

A 回答 (4件)

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 );
  }
}
    • good
    • 0

個人的には引数で渡す方が好きです


--- 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 );
  }
}
    • good
    • 0

グローバル変数なら引数にする必要はないですね


--- 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 );
  }
}
    • good
    • 0

可能ですよ


--- 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を宣言しても特に問題ないという認識で合っていますでしょうか?

ご回答に質問を重ねてしまい申し訳ないのですが、この機会に理解を深めたいと思います。
よろしくお願いいたします。

補足日時:2009/03/14 20:05
    • good
    • 0

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