サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>ユニークなファイル名
[長さが一定のレコード]←このソース→[ランダムアクセスファイル]
/* 今日は、標準ライブラリ関数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言語講座−それ自体コンパイルできる教材を使った講座です−