标准I / O库提供了两个函数以帮助创建临时文件,第一个函数为tmpnam。
#include <stdio.h>
char *tmpnam(char *s);
tmpnam()产生一个与现在文件名不同的一个有效路径名字符串。每次调用它时,它都产生一个不同的路径名。多调用次数为TMP_MAX。
tmpnam()的s如果为NULL,则返回值存放到一个静态的区中。如果s不为NULL,则认为其指向长度至少为L_tmpnam个数的字符数组中。所产生的文件名存放到该数组中,也作为函数返回值返回。
tmpnam产生的文件名,在文件系统中一定不存在,因此,程序员可以创建临时文件,进行后续编程。示例代码如下:
#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;
}
程序执行结果如下:
tmpfile函数原型如下:
#include <stdio.h>
FILE *tmpfile(void);
创建的临时文件在程序退出时会被自动删除。
#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;
}
程序执行结果如下:
在getchar函数执行前,可以新开一个命令窗口,来查看进程占用的文件描述符,看到了/tmp下的临时文件,并被系统做了deleted标记。从/tmp目录下,也找不到这个临时文件。但是这个文件在内存中是存在的(Linux系统规定,一个文件如果有连接计数器不为0,或者其进程打开数不为0,均不会删除其文件内容)。
另外,自己实现一个tmpfile()函数,也非常简单,步骤如下:
先调用tmpnam()产生一个唯一的路径名。
调用fopen()打开。
调用unlink()删除。
说明:利用这个特点来实现tmpfile()。
Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5,京公海网安备11010802025203号