日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C创建临时文件

發布時間:2025/3/15 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C创建临时文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:Linux下除了有實實在在的文件外,還可以創建臨時的文件和目錄,這里介紹兩個創建臨時文件的函數,tmpfilef和mkstemp,以及創建臨時目錄的函數mkdtemp。這三個函數具體用法如下。

一、創建一個無名的臨時文件,程序退出時關閉臨時文件
(1)頭文件 ? ? ? ?#include <stdio.h>
(2)函數原型 ? FILE?*tmpfile(void);
(3)返回值
? ? ? ? ? ? 成功:返回一個文件流
? ? ? ? ? ? 失敗:NULL,沒有創建臨時文件
注意:tmpfile創建的臨時文件只能讀取一次,讀取之后里面的內容就沒有了

具體代碼如下:

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>#define MAXLINE 1029 int main(int argc,char *argv[]) {char tempname[100] = "hello";char line[MAXLINE]; //L_tmpnam是定義在頭文件<stdio.h>中FILE *fp;char buf[100];fp = tmpfile(); //創建臨時文件fputs("one line output",fp); //把數據寫到臨時文件流中rewind(fp); //重置流到文件頭fgets(line,sizeof(line),fp); //從臨時文件流中讀取數據fgets(buf,sizeof(buf),fp); //tmpfile創建的臨時文件只能讀取一次,讀取之后里面的內容就沒有了 printf("%s\n",line);printf("%s\n",buf);//fputs(line,stdout); //輸出數據 return 0;}

運行結果如下:

從圖中的顯示結果可知道驗證了這句話:tmpfile創建的臨時文件只能讀取一次,讀取之后里面的內容就沒有了

二、創建一個臨時文件,文件名自定義
(1)函數原型 ?int?mkstemp(char *template);
(2)參數:
? ? ? ? ? ? a、template:臨時文件的名字,最后6個字符一定是XXXXXX,絕對不能少,記得是大寫
(3)返回值:
? ? ? ? ? ? ?成功:文件描述符,并創建一個臨時文件,文件名是自定義的,后6個字符是系統自己填充
? ? ? ? ? ? ?失敗:-1
特點:這個函數創建的臨時文件可以讀多次,而且數據不會丟失,這是上面tmpfile函數所沒有的功能

具體代碼如下:

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>#define MAXLINE 1029int main(int argc,char *argv[]) {int fd;char name[] = "/tmp/dirXXXXXX"; //后面記得加XXXXXX,并且是大寫的,創建臨時文件成功的時候系統會自動填充字符char buf2[100],buf1[100] = "hello world\n";char buf3[100];bzero(buf3,100); bzero(buf2,sizeof(buf2)); fd = mkstemp(name); //創建一個臨時文件if(fd == -1){perror("mkstemp");exit(1);}printf("temp file name is: %s\n",name); write(fd,buf1,strlen(buf1)); //寫數據到臨時文件中lseek(fd,0,SEEK_SET); //重新把文件指針偏移到文件頭read(fd,buf2,sizeof(buf2)); //從臨時文件中讀出數據lseek(fd,0,SEEK_SET); //重新把文件指針偏移到文件頭read(fd,buf3,sizeof(buf3)); //可以讀多次,而且數據不會丟失printf("%s",buf3);fputs(buf2,stdout);return 0; }

運行效果如下:

比較上面的函數這里的區別出來了:這個函數創建的臨時文件可以讀多次,而且數據不會丟失,這是上面tmpfile函數所沒有的功能

好了上最后一個函數:

三、創建臨時目錄
(1) 函數原型 ? ?char?*mkdtemp(char *template);
(2)參數:臨時目錄的路徑,最后6個字符一定是XXXXXX,絕對不能少,記得是大寫
(3)返回值:
? ? ? ? ? ? ? 成功:返回指向目錄名的指針,創建目錄成功
? ? ? ? ? ? ? 失敗:NULL
注意:這個程序退出后不會自動從文件系統中刪除目錄,要用unlink函數來刪除

代碼如下:

#include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>#define MAXLINE 1029int main(int argc,char *argv[]) {char *path;DIR *entry;struct dirent *ep;struct stat fileinfo;bzero(&fileinfo,sizeof(fileinfo));char name[] = "/tmp/dirXXXXXX";path = mkdtemp(name); //創建一個臨時目錄if(path == NULL){perror("mkdtemp");exit(1);}lstat(path,&fileinfo);if(S_ISDIR(fileinfo.st_mode)) //判斷是否是目錄{printf("the file is directory\n");}else if(S_ISREG(fileinfo.st_mode)) //判斷是否是普通文件{printf("the file is regular file\n");} printf("temp directpry name:%s\n",path);entry = opendir(path); //打開目錄chdir(path); //進入目錄mkdir("test",0777); //創建一個名字為test的目錄int fd = open("test.txt",O_RDWR|O_CREAT,0777); //以讀寫權限打開一個名字為test.txt的文件,如果不存則創建//可以在臨時目錄中創建文件并進行讀寫操作char buf4[] = "hello world";char buf5[100];bzero(buf5,sizeof(buf5));write(fd,buf4,sizeof(buf4));lseek(fd,0,SEEK_SET); //重新把文件指針偏移到文件頭read(fd,buf5,sizeof(buf5));printf("%s\n",buf5); while(1){ep = readdir(entry); //讀目錄中的文件if(ep == NULL)break;printf("%s\n",ep->d_name); //打印目錄中的文件名字} unlink(path); //解除連接,從文件系統中刪除創建的臨時目錄return 0; }

運行效果如下:

關閉文件方法(remove和unlink)

1、

先關后刪

os.close(fd) os.remove(fname) fd 為文件描述符與文件對象不是一樣的需要系統級別的關閉

2、

  • 當remove() 中的pahtname指定為目錄時,相當于調用rmdir 刪除目錄,
  • 當remove() 中的pathname指定問文件時,相當于調用unlink 刪除文件鏈接

所以發現remove是間接調用unlink來刪除文件的目的。

使用方法

??int remove(const char *pathname); ?// #include <stdio.h>
? ?int unlink(const char *pathname); ?// #include <unistd.h>

? ?int rmdir(const char *pathname); ? // #include <unistd.h>

總結

以上是生活随笔為你收集整理的C创建临时文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。