當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 函數(shù)tmpnam和tmpfile的用法
標(biāo)準(zhǔn)I / O庫提供了兩個函數(shù)以幫助創(chuàng)建臨時文件,第一個函數(shù)為tmpnam。
#include <stdio.h>
char *tmpnam(char *s);
tmpnam()產(chǎn)生一個與現(xiàn)在文件名不同的一個有效路徑名字符串。每次調(diào)用它時,它都產(chǎn)生一個不同的路徑名。多調(diào)用次數(shù)為TMP_MAX。
tmpnam()的s如果為NULL,則返回值存放到一個靜態(tài)的區(qū)中。如果s不為NULL,則認(rèn)為其指向長度至少為L_tmpnam個數(shù)的字符數(shù)組中。所產(chǎn)生的文件名存放到該數(shù)組中,也作為函數(shù)返回值返回。
tmpnam產(chǎn)生的文件名,在文件系統(tǒng)中一定不存在,因此,程序員可以創(chuàng)建臨時文件,進(jìn)行后續(xù)編程。示例代碼如下:
#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;
}
程序執(zhí)行結(jié)果如下:
tmpfile函數(shù)原型如下:
#include <stdio.h>
FILE *tmpfile(void);
創(chuàng)建的臨時文件在程序退出時會被自動刪除。
#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;
}
程序執(zhí)行結(jié)果如下:
在getchar函數(shù)執(zhí)行前,可以新開一個命令窗口,來查看進(jìn)程占用的文件描述符,看到了/tmp下的臨時文件,并被系統(tǒng)做了deleted標(biāo)記。從/tmp目錄下,也找不到這個臨時文件。但是這個文件在內(nèi)存中是存在的(Linux系統(tǒng)規(guī)定,一個文件如果有連接計數(shù)器不為0,或者其進(jìn)程打開數(shù)不為0,均不會刪除其文件內(nèi)容)。
另外,自己實現(xiàn)一個tmpfile()函數(shù),也非常簡單,步驟如下:
先調(diào)用tmpnam()產(chǎn)生一個唯一的路徑名。
調(diào)用fopen()打開。
調(diào)用unlink()刪除。
說明:利用這個特點(diǎn)來實現(xiàn)tmpfile()。