用當前系統時間作為文件名創建文件


用當前系統時間作為文件名創建文件

  只要將獲取的系統時間存入字符數組,就可以作為文件名創建文件了。關於獲取系統時間的各種方法,詳見我的另一篇文章C/C++ 獲取當前系統時間(time_t和tm)清晰梳理。下面給出幾種常用方法的代碼:【注意】文件名中不能含有  / \ : * ? " < > |

方法一:使用sprintf()把格式化的時間數據寫入字符數組中

  sprintf()函數頭文件:#include <stdio.h>

 

  原型 :  int sprintf(char *str, char * format [, argument, …]);

  參數說明:

    str為要寫入的字符串;

    format為格式化字符串,與printf()函數相同;

    argument為變量。

  #include <stdio.h>

  #include <time.h>

  int main ()

  {

      FILE *fp = NULL;

      time_t timep;

      struct tm *p;

      char name[256] = {0};

      time(&timep);//獲取從1970至今過了多少秒,存入time_t類型的timep

      p = localtime(&timep);//用localtime將秒數轉化為struct tm結構體

   sprintf(name,"%d.%d.%d %d:%02d.txt",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min[c1] );//把格式化的時間寫入字符數組中

   printf("創建文件名稱為:%s\n", name);

  if((fp = fopen(name, "w")) == NULL)

  // if((fp=fopen(name, O_CREAT| O_RDWR| O_APPEND[c2] )     // [c1]由於 sprintf 跟 printf 在用法上幾乎一樣,只是打印的目的地不同而已,前者打印到字符串中后者則直接在命令行上輸出。這也導致 sprintf 比 printf 有用得多。

        perror("");

     fclose(fp);

       return 0;

}


int sprintf( char *buffer, const char *format [, argument] … );

1、格式化數字字符串

  sprintf最常見的應用之一莫過於把整數打印到字符串中,例:

  // 把整數123打印成一個字符串保存在s中。

  sprintf(s, "%d", 123); // 產生"123"

1.read

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

  參數size,表示一次讀取的數據單元大小,nmemb表示讀取的次數。

       成功時fread返回的值與nmemb相等;若小於nmemb但是大於0,則可能是到了文件末尾,不夠次數;若返回0,則是文件讀取錯誤,不滿一個size的大小。

      所以循環讀取文件的時候,while(可以判斷是否大於等於0)作為條件,里面再基於feof函數判斷是否到了文件末尾而退出循環。

2.write

  size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

  參數size,表示一次寫入的數據單元大小,nmemb表示寫入的次數。

       成功時fwrite返回的值與nmemb相等;若小於nmemb表示出錯了,可以使用perror函數查看錯誤原因。

*/

 

在當前目錄下創建一個txt文本文件,可以修改后綴名創建其他文件。

附加:struct tm結構體內部

    struct tm

    {

        int tm_sec;  /*秒,正常范圍0-59, 但允許至61*/

        int tm_min;  /*分鍾,0-59*/

        int tm_hour; /*小時, 0-23*/

        int tm_mday; /*日,即一個月中的第幾天,1-31*/

        int tm_mon;  /*月, 從一月算起,0-11*/  1+p->tm_mon;

        int tm_year;  /*年, 從1900至今已經多少年*/  1900+ p->tm_year;

        int tm_wday; /*星期,一周中的第幾天, 從星期日算起,0-6*/

        int tm_yday; /*從今年1月1日到目前的天數,范圍0-365*/

        int tm_isdst; /*日光節約時間的旗標*/

};

 

方法二:利用strftime()把時間格式化並寫入字符數組中

  strftime()函數頭文件#include <time.h>

  原型 : size_t strftime(char *str, size_t count, const char *format, const struct tm *tm);

  參數說明:

  str, 表示返回的時間字符串

  count, 要寫入的字節的最大數量

  format, 格式字符串由零個或多個轉換符和普通字符(除%)

  tm, 輸入時間

  #include <stdio.h>

  #include <time.h>

  int main ()

  {

      FILE *fp = NULL;

      time_t timep;

      char name[256] = {0};

      time(&timep);//獲取從1970至今過了多少秒,存入time_t類型的timep

      strftime( name, sizeof(name), "%Y.%m.%d %H-%M-%S.txt",localtime(&timep) ); //最后一個參數是用localtime將秒數轉化為struct tm結構體

      printf("創建文件名稱為:%s\n", name);

      if((fp = fopen(name, "w")) == NULL)

           perror("");

      fclose(fp);

      return 0;

}

附加:關於函數strftime()的格式符號

 

fread()函數:

1. 作用:從一個文件流中讀取數據

2. 函數原型如下:

 

       size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

         -- buffer:指向數據塊的指針

         -- size:每個數據的大小,單位為Byte(例如:sizeof(int)就是4)

         -- count:數據個數

         -- stream:文件指針

注意:返回值隨着調用格式的不同而不同:

(1) 調用格式:fread(buf,sizeof(buf),1,fp);

讀取成功時:當讀取的數據量正好是sizeof(buf)Byte時,返回值為1(count);則返回值為0(讀取數據量小於sizeof(buf))

(2)調用格式:fread(buf,1,sizeof(buf),fp);

讀取成功返回值為實際讀回的數據個數(單位為Byte)

代碼參考:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(int argc, char *argv[])

{

       FILE *filp = NULL;

       char fileDir[] = "/home/yangzhiyuan/Documents/test.txt";

       char dataPtr[] = "Helloworld";

       printf("sizeof(dataPtr) = %ld\n",sizeof(dataPtr));

       filp = fopen(fileDir,"w+");  /* 可讀可寫,不存在則創建 */

       int writeCnt = fwrite(dataPtr,sizeof(dataPtr),1,filp);  /* 返回值為1 */

       //int writeCnt = fwrite(dataPtr,1,sizeof(dataPtr),filp);  /* 返回值為11 */

       printf("writeCnt = %d\n",writeCnt);

       fclose(filp);

 

       FILE *fp = NULL;

       fp = fopen(fileDir,"r");

       char buffer[256];

       int readCnt = fread(buffer,sizeof(buffer),1,fp);  /* 返回值為0 */

       //int readCnt = fread(buffer,1,sizeof(buffer),fp);  /* 返回值為11 */      

       printf("readCnt = %d\n",readCnt);

       fclose(fp);

      

       printf("%s\n",buffer);

       exit(0);

}

轉自:https://blog.csdn.net/kunkliu/article/details/102550648


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM