サイトマップ / C言語講座出入り口総目次目次:ファイル>ユニークなファイル名

青い直線

ユニークなファイル名

青い直線

[長さが一定のレコード]←このソース→[ランダムアクセスファイル]

/* tmpnam( )、freopen( )、remove( ) */

/* 今日は、標準ライブラリ関数tmpnam( )、freopen( )、remove( ) について学びます。

    #include <stdio.h>
    char *tmpnam(char *s);

    例:tmpnam(s);

    戻り値:ユニークなファイル名

tmpnam( ) は、現在開かれているファイル名と異なる、ユニークなファイル名を返します。引数として、文字列に対するポインタを取ります。ファイル名の長さは、stdio.h のなかで、

    #define L_tmpnam 13

などとマクロで定義されています。この場合は 13 ですが、コンパイラによって文字列の長さが異なります。

    char filename[L_tmpnam];

文字列の長さはこのようにして決めれば、違うコンパイラでもメモリが不足する心配はありません。

何種類のユニークなファイル名を返せるかについては、stdio.h のなかで、

    #define TMP_MAX 9999

などとマクロで定義されていますが、これも処理系によって値が違います。

    #include <stdio.h>
    FILE *freopen(const char *filename,
                const char *mode, FILE *oldfp);

    例:newfp = freopen(filename, "r", oldfp);

    戻り値
    成功した場合:ファイルポインタ
    失敗した場合:NULL

freopen( ) は、ファイルを一旦クローズして、指定したモードで再度開きます。既に閉じていたりして、クローズに失敗してもそれを無視します。

今回は書き込みモードで開き、freopen( ) で、読み込みモードにしています。

    #include <stdio.h>
    int remove(const char *filename);

    例:error = remove(filename);

    戻り値
    成功した場合:0
    失敗した場合:0以外

remove( ) は、ファイルを削除します。もし、ファイルがまだ開いていたら、削除に失敗します。

ソースプログラムの説明

今回のプログラムでは、tmpnam( ) でユニークなファイル名を作製し、fopen( ) でその名前のファイルを書き込みモードで開き、データを書き込み、freopen( ) で読み込みモードにして、書き込んだデータを表示し、ファイルを閉じて、remove( ) で削除します。

複雑なことをやっているわけではないので、ソースプログラムはわかりやすいと思います。後は、 ソースプログラムの中のコメントを見て下さい。 */

/* ここからソースプログラム */

#include <stdio.h>

#define MAX_COUNT 10    /* ファイルに書き込むデータ数 */

void WriteData(FILE *fp);
void ReadData(FILE *fp);
void main(void);

  /* ファイルにユニークなファイル名を書き込む */
void WriteData(FILE *fp)
{
    int i;
    char temp[L_tmpnam];

    for (i = 0; i < MAX_COUNT; i++) {
        tmpnam(temp);
        fputs(temp, fp);        /* fputs( ) は、ストリームに '\0' を書き込みません */
        fputs("\n", fp);
    }
    fputs("\0", fp);		/* ここで '\0' を書き込みます */
}

  /* ファイルからデータを読み込み、表示する */
void ReadData(FILE *fp)
{
    int c;

    while ((c = getc(fp)) != EOF)    /* EOF でなければ1字読む */
        putchar(c);                  /* それをコンソールに出力 */
    printf("\n");
}

void main(void)
{
    FILE *ofp, *nfp;
    char filename[L_tmpnam];            /* L_tmpnam: 本文参照 */

    tmpnam(filename);                   /* ユニークなファイル名は filename に入る */
    printf("ユニークなファイル名:%s\n", filename);

    ofp = fopen(filename, "w");         /* 書き込みモードで開く */ 

    WriteData(ofp);                     /* ファイルにデータを書き込む */

    nfp = freopen(filename, "r", ofp);  /* 読み込みモードで開く */

    ReadData(nfp);                      /* ファイルからデータを読み込む */

    fclose(nfp);                        /* クローズしてから */
    remove(filename);                   /* 削除する */

}

/* ここまでソースプログラム */

[長さが一定のレコード]←このソース→[ランダムアクセスファイル]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>ユニークなファイル名