《UNIX环境高级编程》笔记--临时文件

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

字符串以反映临时文件的名字。

你可能感兴趣的:(《UNIX环境高级编程》笔记--临时文件)