重定向及时间

发布于:2023-01-21 ⋅ 阅读:(483) ⋅ 点赞:(0)

重定向

stdout:终端显示

int stdout_value=dup(fileno(stdout));  dup复制一个文件描述符

dup2(stdout_value,fileno(stdout));   恢复控制台输出

#include <stdio.h>

int main()
{
	int stdout_value=dup(fileno(stdout));
	printf("手握日月摘星辰");
	printf("%d\n",stdout_value) ;
	
	freopen("stdout.txt","a",stdout);	//将本应该显示在终端的显示在文件,文件不存在会新建文件 
	printf("手握日月摘星辰");
	printf("%d\n",stdout_value) ;
	printf("世间无我这般人");
	fflush(stdout);	//刷新缓存区,不刷新,这块的缓存会接着显示到终端 
	//关闭文件,继续显示在终端 
	dup2(stdout_value,fileno(stdout)); 
	printf("世间无我这般人");
	
	return 0;
 } 

 fflush(stdout):刷新缓存区

stdin:键盘输入

//重定向stdin(键盘输入) 改为到stdin.txt文件 
	freopen("stdin.txt","r",stdin);
	scanf("%d",&a);	 
	printf("freopen() :  printf to stdout .txt  %d\n",a);
	// fclose(stdout)的结果: 
	//1. 关闭stdout指针文件,就无法输出到stdout.txt
	//2. 因为stdout被重定向到了stdout.txt文件,所以无法输出到终端 
	fclose(stdout); 
	printf("fclose stdout.txt,test\n");

stderror:错误

时间

1.常用的时间

GMT(格林威时间)

UTC(世界标准时间)

LOCAL TIME(本地时间)

EPOCH(纪元点)

CLOCK TICK(时钟计时单元)

2.获取时间戳

//获取当前系统时间戳,定义变量,用于保持获取的时间戳 
time_t t1;

3.秒数转换 

时间戳本身获取的是秒数,如果我们有需要毫秒或者微秒等需求,可以使用如下方式
#include <stdio.h>
#include <utime.h>
#include <time.h>
/*2.编写一个函数,返回当前时间的秒数,毫秒数,微秒数,纳秒数*/

int main()
{
	time_t t_i;
	time(&t_i);
	struct timespec ts;
	//秒数
	printf("秒数为:%lld\n",t_i);
	//毫秒数
	clock_gettime(CLOCK_REALTIME,&ts);
	long long ms=ts.tv_sec*1000+ts.tv_nsec/1000000;
	printf("毫秒数为ms=%lld\n",ms) ;
	//微秒数
	long long us=ts.tv_sec*1000000+ts.tv_nsec/1000;
	printf("微秒数为us=%lld\n",us) ;
	//纳秒数
	long long ns=ts.tv_sec*1000000000+ts.tv_nsec;
	printf("微秒数为ns=%lld\n",ns) ;
	
	return 0;
}
clock_gettime 第一参数有两种数值:
        CLOCK_MONOTONIC :以绝对时间为准
        CLOCK_REALTIME :相对时间
4.获取日历时间
.
time_t t;
	time(&t);//t就保存了时间戳
	printf("时间戳:%lld\n",t); 
	struct tm *timeData;

//  struct tm {
//    int tm_sec;
//    int tm_min;
//    int tm_hour;
//    int tm_mday;
//    int tm_mon;			//它是从0~11 
//    int tm_year;			//它是从1900 
//    int tm_wday;
//    int tm_yday;			//一年中的多少天 
//    int tm_isdst;		
//  };
	
	timeData=localtime(&t); 
	
	printf("tm_sec=%d\n", timeData->tm_sec);
	printf("tm_min=%d\n", timeData->tm_min);
	printf("tm_hour=%d\n",timeData->tm_hour);
	printf("tm_mday=%d\n",timeData->tm_mday);
	printf("tm_mon=%d\n", timeData->tm_mon+1);
	printf("tm_year=%d\n",timeData->tm_year+1900);
	printf("tm_wday=%d\n",timeData->tm_wday);
	printf("tm_yday=%d\n",timeData->tm_yday);
	printf("tm_isdst=%d\n",timeData->tm_isdst);	

6.日历时间转换为时间戳

//通过mktime将日历时间转化为时间戳 
time_t t2 = mktime(timeData); 
printf("%d\n", t2);
 //修改一下日历的时间 
timeData->tm_min = 100; //超出60分钟的部分会补给小时 
time_t t3 = mktime(timeData); 
printf("%d\n", t3);
 //格林威治时间比北京时间差8小时
 //获取格林威治的日历时间 
struct tm * gmData = gmtime(&t1); 
printf("%d %d %d\n", gmData->tm_year, gmData->tm_mon, gmData->tm_mday); 
//此处会相差8小时 
printf("%d %d %d \n", gmData->tm_hour, gmData->tm_min, gmData->tm_sec);

7.格式化时间

//格式化时间,成中国人习惯阅读的时间格式 
char current_time_str[20]; 
//文件名的格式 
size_t size = strftime(current_time_str, 20, "%Y:%m:%d %H%M%S", current_time); printf("%d\n", size); 
printf("%s\n", current_time_str);

作业:

1.编写一个模拟时钟,在文件print.txt中每隔一秒进行打印一次。累计打印次数,由另一个文件scanf.txt读入的数据确定。
提示:可以使用sleep(1) 进行延时1s  ,头文件在<unistd.h>

#include <stdio.h>
#include <utime.h>
#include <time.h>
#include <unistd.h>
#define N 10
/*1.编写一个模拟时钟,在文件print.txt中每隔一秒进行打印一次。
累计打印次数,由另一个文件scanf.txt读入的数据确定。
提示:可以使用sleep(1) 进行延时1s  ,头文件在<unistd.h>*/
int main()
{
	FILE *pf=NULL;
	int i;
	int m=0;
	pf=fopen("print.txt","w");
	for(i=0;i<N;i++){
		time_t t_i;
		time(&t_i);
		struct tm *tout;
		tout=localtime(&t_i);
		char arr[50];
		size_t ret=strftime(arr,50,"%Y年%m月%d日 %X\n",tout);
		fprintf(pf,"%s",arr);
		m++;
		fclose(pf);
		sleep(1);
		pf=fopen("print.txt","a");
		printf("%s ",arr);
	}
	fclose(pf);
	pf=fopen("scanf.txt","w");
	fprintf(pf,"%d",m);
	fclose(pf);
	 
	return 0;
 } 

2.编写一个函数,返回当前时间的秒数,毫秒数,微秒数,纳秒数

#include <stdio.h>
#include <utime.h>
#include <time.h>
/*2.编写一个函数,返回当前时间的秒数,毫秒数,微秒数,纳秒数*/

int main()
{
	time_t t_i;
	time(&t_i);
	struct timespec ts;
	//秒数
	printf("秒数为:%lld\n",t_i);
	//毫秒数
	clock_gettime(CLOCK_REALTIME,&ts);
	long long ms=ts.tv_sec*1000+ts.tv_nsec/1000000;
	printf("毫秒数为ms=%lld\n",ms) ;
	//微秒数
	long long us=ts.tv_sec*1000000+ts.tv_nsec/1000;
	printf("微秒数为us=%lld\n",us) ;
	//纳秒数
	long long ns=ts.tv_sec*1000000000+ts.tv_nsec;
	printf("微秒数为ns=%lld\n",ns) ;
	
	return 0;
}

结果为:

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到