zoukankan      html  css  js  c++  java
  • C/C++ 临时文件

    一、背景

      有时程序需要存储很大量的数据,或者在几个进程间交换数据,这时您可能考虑到使用临时文件。使用临时文件要考虑几个问题:
      1、保证临时文件间的文件名不互助冲突。
      2、保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
      在linux下有专门处理临时文件的函数,先简单接收两个函数。

    二、简单实用的两个函数:mkstemp和tempfile

      2.1 mkstemp函数

      头文件:#include <stdlib.h>

      函数原型:int mkstemp(char * template);

      执行:mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。

      结果: 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。

      备注:临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <unistd.h>
     4 #include <stdlib.h>
     5 
     6 int write_temp_file(char* buffer,size_t length) {
     7     int len=length;
     8     char filename_template[]="/tmp/temp_file.XXXXXX";
     9     int fd=mkstemp(filename_template);
    10     unlink(filename_template);//Unlink the file, so it'll be removed when close
    11     printf("Template file name:%s
    ",filename_template);
    12     write(fd,&len,sizeof(len));
    13     write(fd,buffer,len);
    14     return fd;
    15 }
    16 
    17 char* read_temp_file(int fd, size_t* length) {
    18     char* buffer;
    19     lseek(fd,0,SEEK_SET);
    20     read(fd,length,sizeof(size_t));
    21     buffer=(char*)malloc(*length);
    22     read(fd,buffer,*length);
    23     close(fd); // Temp file will be deleted
    24     return buffer;
    25 }
    26 
    27 int main(int argc, char** argv) {
    28     char buffer[]="Test template files";
    29     int fd=write_temp_file(buffer,strlen(buffer));
    30     int len=0;
    31     char* result=read_temp_file(fd,&len);
    32     printf("Len:%d
    Content:%s
    ",len,result);
    33     free(result);
    34     return 0;
    35 }

      2.2 tmpfile函数

      头文件:#include <stdio.h>

      函数原型:FILE *tmpfile(void);

      执行:tmpfile函数创建并打开一个临时文件(二进制,在 /tmp文件夹中),并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。

      结果:如果成功,该函数返回一个流指针创建的临时文件。如果不能创建文件,则返回NULL。

     1 #include <stdio.h>
     2 int main()
     3 {
     4     FILE *tempfp;
     5     char line[256];
     6     tempfp=tmpfile();
     7     if(tempfp==NULL)
     8     {
     9         printf("tmpfile error!
    ");
    10         return 1;
    11     }
    12     printf("Opened a temporary file OK!
    ");
    13     fputs("One line of output 
    ",tempfp);
    14     rewind(tempfp);
    15     if(fgets(line, sizeof(line),tempfp)==NULL)
    16     {
    17         printf("fgets error!
    ");
    18         return 2;
    19     }
    20     fputs(line, stdout);
    21     return 0;
    22 }

     

  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/xiaofeiIDO/p/8044851.html
Copyright © 2011-2022 走看看