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