函數tmpnam和tmpfile的用法
時間:2018-09-21 來源:未知
標準I / O庫提供了兩個函數以幫助創建臨時文件,第一個函數為tmpnam。
#include <stdio.h>
char *tmpnam(char *s);
tmpnam()產生一個與現在文件名不同的一個有效路徑名字符串。每次調用它時,它都產生一個不同的路徑名。多調用次數為TMP_MAX。
tmpnam()的s如果為NULL,則返回值存放到一個靜態的區中。如果s不為NULL,則認為其指向長度至少為L_tmpnam個數的字符數組中。所產生的文件名存放到該數組中,也作為函數返回值返回。
tmpnam產生的文件名,在文件系統中一定不存在,因此,程序員可以創建臨時文件,進行后續編程。示例代碼如下:
#include <stdio.h>
#define N 128
int main() {
char s[N] = {0}, *p;
if ((p = tmpnam(s)) == NULL) {
perror("tmpnam");
return -1;
}
printf("s=%s p=%s\n", s, p);
return 0;
}
程序執行結果如下:

tmpfile函數原型如下:
#include <stdio.h>
FILE *tmpfile(void);
創建的臨時文件在程序退出時會被自動刪除。
#include <stdio.h>
#define N 128
int main() {
char s[N] = {0}, *p;
FILE * fp;
int ch = 0;
if ((p = tmpnam(s)) == NULL) {
perror("tmpnam");
return -1;
}
printf("s=%s p=%s\n", s, p);
printf("TMP_MAX=%d\n", TMP_MAX);
if ((fp = tmpfile()) == NULL) {
perror("tmpfile");
return -1;
}
f (fputc('a', fp) == EOF) {
perror("fputc");
return -1;
}
fseek(fp, 0, SEEK_SET);
ch = fgetc(fp);
printf("ch=%d\n",ch);
getchar();
puts("end main");
fclose(fp);
ch = fgetc(fp);
printf("ch=%d\n",ch);
return 0;
}
程序執行結果如下:

在getchar函數執行前,可以新開一個命令窗口,來查看進程占用的文件描述符,看到了/tmp下的臨時文件,并被系統做了deleted標記。從/tmp目錄下,也找不到這個臨時文件。但是這個文件在內存中是存在的(Linux系統規定,一個文件如果有連接計數器不為0,或者其進程打開數不為0,均不會刪除其文件內容)。

另外,自己實現一個tmpfile()函數,也非常簡單,步驟如下:
先調用tmpnam()產生一個唯一的路徑名。
調用fopen()打開。
調用unlink()刪除。
說明:利用這個特點來實現tmpfile()。

