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