ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのvprintf() 系の va_list

  • mixiチェック
  • このエントリーをはてなブックマークに追加
vprintf()系について質問があります.

たとえばファイル
        1.txt
        2.txt
        3.txt
があったとして,これを開くとき,今までは

        for (i=0; i<3; i++) {
                sprintf( filename, "%d.txt", i );
                fp = fopen( filename, "r" );

としていました.

しかしふと思ったことがあります.
fopen() のファイル名を printf() のように指定できたら便利かも・・・
たとえば
        fopen( "%d.txt", i, "r" );
のように・・・


そこで以下のような my_fopen() をつくってみましたが,ひとつ問題があります.

        FILE        *my_fopen( const char *fmt, ... )
        {
                char filename[FILENAME_MAX], *mode;
                FILE *fp;
                va_list va;

                va_start( va, fmt );
                vsprintf( filename, fmt, va );
                mode = va_arg( va, char* );                // ここに問題がある
                va_end( va );

                return fopen( filename, mode );
        }

        int main( void )
        {
                FILE *fp;

                for (int i=0; i<3; i++) {
                        fp = my_fopen( "%d.txt", i, "r" );
                        //*** オープンチェックやfclose()は省略させていただきます ***//
                }

                return 0;
        }

vprintf() 系では,呼び出し後,引数の va_list の値は未定義となるそうです.
よってその直後に
        mode = va_arg( va, char* );
としてもオープンモードを得ることができません.

これを打開する方法を教えていただけると助かります.

コメント(4)

FILE* my_fopen(char *fmt, ... )
{
char filename[FILENAME_MAX], *mode;
FILE *fp;
int k;
va_list va;
va_start( va, fmt );
k = va_arg(va,int);
mode = va_arg( va, char* ); // ここに問題がある
// printf("%s",filename);
va_end( va );
fp = fopen( filename, mode );
return fp;
}
int main(int argc,char* argv[])
{
FILE *fp;
int i;
for(i=1; i<3; i++)
{
fp = my_fopen( "%d.txt",i,"r" );
}
exit(0);
}
このようになったら、多分できるかもしれないですけど。
>1
たしかに.
とてもシンプルかつ確実ですね

>2
第二引数がint型だったら使えるということですね
ていうか、そもそもそんなくだらないアイデアは捨てなさい。
その関数はvsprintfのエラーとfopenのエラーをしっかり区分して伝えなければならない。
呼び出し元は返ってきたエラーがどの段階で発生したどのようなエラーかを識別しなければならない。
しっかりエラー処理するなら呼び出し元の手間は増えるかもしれない。
no such fileのエラーならば、呼び出し元がユーザーにエラーを伝える際、
開こうとしたファイル名をユーザーに伝えるために関数内の処理と同様のファイル名構築処理をしなければならない。
たいした得もないのに大損ばかりだ。
エラーの存在を完全に無視したいい加減な設計思想があるんだろう。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング