用当前系统时间作为文件名创建文件


用当前系统时间作为文件名创建文件

  只要将获取的系统时间存入字符数组,就可以作为文件名创建文件了。关于获取系统时间的各种方法,详见我的另一篇文章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