サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−