标准I/O库之临时文件


ISO C标准I/O库提供了两个函数以帮助创建临时文件。

#include <stdio.h>

 *tmpnam(  **tmpfile( 

若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。下一次调用tmpnam时,会重写该静态区(这意味着,如果我们调用此函数多次,而且想保存路径名,则我们应该保存该路径名的副本,而不是指针的副本)。如若ptr不是NULL,则认为它指向长度至少是L_tmpnam个字符的数组(常量L_tmpnam定义在头文件<stdio.h>中)。所产生的路径名存放在该数组中,ptr也作为函数值返回。

tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件。注意,UNIX对二进制文件不作特殊区分。

程序清单5-4 tmpnam和tmpfile函数实例

[root@localhost apue]# cat prog5-

*, tmpnam(NULL));           ((fp = tmpfile()) == NULL)            , fp );    
        (fgets(line, (line), fp) ==

执行程序:

[root@localhost apue]# ./prog5-
/tmp//tmp/

不要被上面的实例程序所迷惑,并不是说必须先用tmpnam产生一个路径名,然后再调用tmpfile创建临时文件。tmpfile单独使用即可创建临时文件。

tmpfile函数经常使用的标准UNIX技术是先调用tmpnam产生一个唯一的路径名,然后,用该路径名创建一个文件,并立即unlink它。

Single UNIX Specification为处理临时文件定义了另外两个函数,它们是XSI的扩展部分。其中第一个是tempnam函数。

#include <stdio.h>
 *tempnam(   *directory,   *

tempnam是tmpnam的一个变体,它允许调用者为所产生的路径名指定目录和前缀。对于目录有4种不同的选择,按下列顺序判断其条件是否为真,并且使用第一个为真的作为目录:

(1)如果定义了环境变量TMPDIR,则用其作为目录。

(2)如果参数directory非NULL,则用其作为目录。

(3)将<stdio.h>中的字符串P_tmpdir用作目录。

(4)将本地目录(通常是/tmp)用作目录。

如果prefix非NULL,则它应该是最多包含5个字符的字符串,用其作为文件名的头几个字符。

该函数调用malloc函数分配动态存储区,用其存放所构造的路径名。.当不再使用此路径名时就可释放此存储区。

程序清单5-5 演示tempnam函数

[root@localhost apue]# cat prog5-

 argc,  *(argc != , tempnam(argv[][] !=   ? argv[][] !=   ? argv[

注意,如果命令行参数(目录或前缀)中的任一个以空白开始,则将其作为null指针传送给该函数。下面显示使用该程序的各种方式。

[root@localhost apue]# ./prog5- /home//home/zhu//prog5-  /tmp/=//tmp ./prog5- /usr/tmp  //tmp/=/no/such/dir ./prog5- /home/zhu//home/zhu/test/QQQaLZExQ                    忽略无效环境目录

上述选择目录名的四个步骤按序执行,该函数也检查相应的目录名是否有意义。如果该目录并不存在(例如/no/such/dir),则跳过这一步,试探对目录名的下一次选择。

XSI定义的第二个函数是mkstemp。它类似于tmpfile,但是该函数返回的不是文件指针,而是临时文件的打开文件描述符。

#include <stdio.h>
 mkstemp(  *-

它所返回的文件描述符可用于读、写文件。临时文件的名字是用template字符串参数选择的。该字符串是一个路径名,其最后6个字符设置为XXXXXX。该函数用于不同字符代换XXXXXX,以创建一路径名。如若mkstemp成功返回,它就会修改template字符串以反映临时文件的名字。

mktemp函数类似于mkstemp,只不过mktemp只构建一个适用于临时文件的名字,它没有创建一个文件,所以它也有与tmpnam和tempnam相同的不足之处。mktemp函数在Single UNIX Specification中被标记为遗留接口。Single UNIX Specification的未来版本可能将遗留接口全部删除,因此应当避免使用它。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书的更多内容可参考:http://www.apuebook.com/

相关内容