#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<unistd.h>
#define BUFSIZE 1024
#define TIMEFMTSTRSIZE 1024
/*
*-y 年
*-m 月
*-d 日
*-H 时
*-M 分
*-S 秒
*
* */
int main(int argc,char** argv)
{
FILE *fp;
time_t stamp;
struct tm* tm;
char buf[BUFSIZE];
int c;
char timeFmtStr[TIMEFMTSTRSIZE];
time(&stamp);
tm=localtime(&stamp);
fp=stdout;
timeFmtStr[0]='\0';
while(1)
{
//在该字符串后加了:说明该选项是需要参数传入 一旦规定某选项需要参数则每次使用该选项一定要输入参数
//在字符串加了-说明可以处理输入的参数 此时c为1 此时输入参数作为打印的路径
c=getopt(argc,argv,"-H:MSy:md");
if(c<0)
break;
switch (c)
{
case 1:
//已输入的第一个地址为输出路径
if(fp==stdout)
{
//处理非(选项或其所带的参数)的字符串,argv[optind-1]可以读取处理字符串
fp=fopen(argv[optind-1],"w");
if(fp==NULL)
{
perror("fopen()");
fp=stdout;
}
}
break;
case 'y':
//optarg可以读取选项后的参数
if(strcmp(optarg,"2")==0)
{
strncat(timeFmtStr,"%y ",TIMEFMTSTRSIZE);
}
else if(strcmp(optarg,"4")==0)
{
strncat(timeFmtStr,"%Y ",TIMEFMTSTRSIZE);
}
break;
case 'm':
strncat(timeFmtStr,"%m ",TIMEFMTSTRSIZE);
break;
case 'd':
strncat(timeFmtStr,"%d ",TIMEFMTSTRSIZE);
break;
case 'H':
if(strcmp(optarg,"12")==0)
{
strncat(timeFmtStr,"%I(%p) ",TIMEFMTSTRSIZE);
}
else if(strcmp(optarg,"24")==0)
{
strncat(timeFmtStr,"%H ",TIMEFMTSTRSIZE);
}
break;
case 'M':
strncat(timeFmtStr,"%M ",TIMEFMTSTRSIZE);
break;
case 'S':
strncat(timeFmtStr,"%S ",TIMEFMTSTRSIZE);
break;
default:
break;
}
}
strftime(buf,BUFSIZE,"NOW:%Y%m%d %H%M%S\n",tm);
fputs(buf,fp);
strftime(buf,BUFSIZE,timeFmtStr,tm);
fputs(buf,fp);
if(fp!=stdout)
fclose(fp);
exit(0);
}
命令行
make dayPrint
测试命令行
./dayPrint -y 4 -mdH 12 -MS /tmp/out /tmp/hhh
打印指定的/tmp/out中的内容
cat /tmp/out
结果:
NOW:20241022 131315
2024 10 22 01(PM) 13 15