重定向
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 后查看