ISO C标准IO库提供了2个函数创建临时文件。
#include <stdio.h>
char *tmpnam(char *ptr); //返回唯一路径名的指针
FILE *tmpfile(void); //成功则返回文件指针,出错则返回NULL
若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指正作为函数值返回。下一次再调用tmpnam时,
会重写该静态区(如果我们调用此函数多次,并且向保存路径名,我们应该保存该路径名的副本,而不是指针的副本);
若ptr不是NULL,则认为它指向长度至少为L_tmpnam个字符的数组,(常量L_tmpnam定义在头文件<stdio.h>中),所
产生的路径名存放在该数组中,ptr也作为函数值返回。
tmpfile创建一个临时二进制文件(wb+),在关闭该文件或程序结束时将自动删除这种文件。
实践:
#include <stdio.h>
int main(void){
char name[L_tmpnam], line[256];
FILE* fp;
int result = 0;
printf("%s\n",tmpnam(NULL));
tmpnam(name);
printf("%s\n", name);
if((fp = tmpfile()) == NULL){
perror("tmpfile");
result = -1;
goto FINALLY;
}
if(fputs("tmpfile content.\n",fp) == EOF){
perror("fputs");
result = -1;
goto FINALLY;
}
rewind(fp);
if(fgets(line,sizeof(line),fp) == NULL){
perror("fgets");
result = -1;
goto FINALLY;
}
fputs(line,stdout);
FINALLY:
if(fp != NULL){
fclose(fp);
}
return result;
}
运行结果:
yan@yan-vm:~/apue$ ./a.out
/tmp/filejMCRqp
/tmp/file2rY6fH
tmpfile content.
Single UNIX Specification为处理临时文件定义了另外2个函数,他们是XSI的扩展部分,其中一个是tempnam函数。
#include <stdio.h>
char *tempnam(const char* directory, const char *prefix);
tempnam是tmpnam的一个变体,它允许调用者为所产生的路径名指定目录和前缀,对于目录有4中不同的选择,按
下列顺序判断其条件是否为真,并且使用第一个为真的作为目录:
1.如果定义了环境变量TMPDIR,则用其作为目录。
2.如果参数directory非NULL,则用其作为目录。
3.将<stdio.h>中的字符串P_tmpdir作为目录。
4.将本地目录(通常是/tmp)作为目录。
XSI定义的第二个函数是mkstemp。它类似于tmpfile,但是该函数返回的不是文件指针,而是临时文件的打开文件描述符。
#include <stdlib.h>
int mkstemp(char *template); //若成功则返回文件描述符,出错则返回-1.
它所返回的文件描述符可用于读写该文件。临时文件的名字是用template字符串参数选择的,该字符时一个路径名,其最后
6个字符设置为XXXXXX,该函数用不用字符替换XXXXXX以创建唯一路径名。如若mkstemp成功返回,它就会修改template
字符串以反映临时文件的名字。