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
字符串以反映临时文件的名字。