掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28715

関数間でのファイルポインタの受け渡し
投稿者---JUNEX(2006/11/04 17:02:53)


はじめまして。JUNEXと申します。
プログラムの中で「ファイルポインタを取得し、失敗すればメッセージを出して終了する」という部分を関数にしてみたのですが、うまくいきません。
具体的には、下記のソースで
printf("file_open:fp=%p\n",fp);
printf("main:fp=%p\n",fp);
という部分の表示が同じアドレスになればmain関数のファイルポインタが書き換えられていると思うのですが、そうなりません。
どこがいけなかったのでしょうか?
よろしければ、ご教授お願いします。

環境
OS:XP SP2
コンパイラ:Borland C++ 5.5.1


#include<stdio.h>
#include<stdlib.h>
void file_open(FILE *fp,char *file_name_p,char mode);
void main(void)
{
    FILE *fp;
    char file_name[1024]="aaa.txt";
    char mode;
    mode='r';
    file_open(fp,file_name,mode);
    printf("main:fp=%p\n",fp);
    fclose(fp);
}

void file_open(FILE *fp,char *file_name_p,char mode)
{
    char temp[128];
    if((fp=fopen(file_name_p,&mode))==NULL){
        printf("「%s」読み込みエラー\n",file_name_p);
        printf("終了するにはエンターキーを押してください\n");
        gets(temp);
        exit(1);
    }
    printf("file_open:fp=%p\n",fp);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数間でのファイルポインタの受け渡し 28716 Werner 2006/11/04 17:35:38


No.28716

Re:関数間でのファイルポインタの受け渡し
投稿者---Werner(2006/11/04 17:35:38)


file_open関数の引数fpは、main関数の変数fpのコピーなので、
file_open関数内で書き換えてもmain関数のfpはそのままです。

あと、fopenの第2引数modeは文字列ですよ。



この投稿にコメントする

削除パスワード

No.28720

Re:関数間でのファイルポインタの受け渡し
投稿者---JUNEX(2006/11/04 20:15:15)


>file_open関数の引数fpは、main関数の変数fpのコピーなので、
>file_open関数内で書き換えてもmain関数のfpはそのままです。
main関数内の「ファイルポインタに格納されたアドレス」を渡したかったのですが、file_open関数では変数fpのコピーになっているのですか?
そうなると、コピーではなくアドレスを渡したい場合にはどのようにしたらよいのでしょうか?

>あと、fopenの第2引数modeは文字列ですよ。
ご指摘ありがとうございます。


この投稿にコメントする

削除パスワード

No.28722

Re:関数間でのファイルポインタの受け渡し
投稿者---RAPT(2006/11/04 20:36:51)


ポインタを使えば良い。
下記が理解できるなら、int を FILE* に置き換えるだけ。

void test( int* pa )
{
    *pa = 10;
}

int main()
{
    int a = 0;
    printf( "before: %d\n", a );
    test( &a );
    printf( "after : %d\n", a );
}




この投稿にコメントする

削除パスワード

No.28731

Re:関数間でのファイルポインタの受け渡し
投稿者---JUNEX(2006/11/05 01:25:40)


void test( int* pa )
{
    *pa = 10;
}

int main()
{
    int a = 0;
    printf( "before: %d\n", a );
    test( &a );
    printf( "after : %d\n", a );
}


上記のプログラムは、
main関数内で宣言した変数aのアドレスをtest関数のポインタに渡し、test関数内でそのアドレスに対して10という値を格納しているため、main関数内のaの中の値が10になっている。
ということですよね?
ですが今回の問題に対してどのように適応すればよいのか分かりません。
もう少しだけアドバイスいただけると大変助かります。
わがままを言うようで、申し訳ありませんがよろしくお願いします。


この投稿にコメントする

削除パスワード

No.28732

Re:関数間でのファイルポインタの受け渡し
投稿者---επιστημη(2006/11/05 01:31:45)
http://blogs.wankuma.com/episteme/


>ですが今回の問題に対してどのように適応すればよいのか分かりません。
>もう少しだけアドバイスいただけると大変助かります。

/* ヒント:*ふたつ */
void file_open(FILE **fp,char *file_name_p,char mode)

とはいいながら、僕だったら
FILE* file_open(const char *file_name_p, char mode)
ってやるだろな。



この投稿にコメントする

削除パスワード

No.28734

Re:関数間でのファイルポインタの受け渡し
投稿者---Blue(2006/11/05 01:35:00)


>ですが今回の問題に対してどのように適応すればよいのか分かりません。
RAPTさんのおっしゃるとおり

>int を FILE* に置き換えるだけ。
だと思いますが。

#include <stdio.h>

void test( FILE** pfp )
{
    *pfp = fopen( "test.txt", "r" );
}

int main( void )
{
    FILE* fp = NULL;
    test( &fp );
    
    if ( fp != NULL )
        fclose( fp );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.28741

Re:関数間でのファイルポインタの受け渡し
投稿者---JUNEX(2006/11/05 02:21:23)


επιστημη様、Blue様アドバイスありがとうございました。
失礼ですがお二方一緒にお返事させていただきます。

επιστημη様

>/* ヒント:*ふたつ */
>void file_open(FILE **fp,char *file_name_p,char mode)
「ポインタのポインタ」を使うということですね?
>とはいいながら、僕だったら
>FILE* file_open(const char *file_name_p, char mode)
>ってやるだろな。
確かにそのほうがスマート(?)な気がしますので取り入れさせていただきたいと思います。


Blue様

#include <stdio.h>

void test( FILE** pfp )
{
    *pfp = fopen( "test.txt", "r" );
}

int main( void )
{
    FILE* fp = NULL;
    test( &fp );
    
    if ( fp != NULL )
        fclose( fp );
    
    return 0;
}


main関数内の「fpというポインタ」のアドレスをtest関数内の「pfpというポインタ」のポインタに格納して、
*pfp = fopen( "test.txt", "r" );で「pfpというポインタ」にファイルポインタを格納するということだと理解しました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧