用當前系統時間作為文件名創建文件
只要將獲取的系統時間存入字符數組,就可以作為文件名創建文件了。關於獲取系統時間的各種方法,詳見我的另一篇文章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
