IO进程练习---往文件中录入当前时间

 题目要求

编程读写一个文件test.txt,每隔1秒向文件中写入一行录入时间的数据,类似这样:

1  2007-7-30 15:16:42  

2  2007-7-30 15:16:43

该程序应该无限循环,直到按Ctrl-C中断程序。

再次启动程序写文件时可以追加到原文件之后,并且序号能够接续上次的序号,比如:

1  2007-7-30 15:16:42

2  2007-7-30 15:16:43

3  2007-7-30 15:19:02

4  2007-7-30 15:19:03

5  2007-7-30 15:19:04

思路:

  1. 打开文件fopen,循环往文件写内容
  2. 每隔1s写入一行,sleep(1);
  3. 计算文件行数,wc -l
  4. 计算当前时间,转换成年月日、时分秒,time,localtime

要实现这个练习,需要用到两个时间的函数

一个是time 

另一个是localtime

还有一个格式化向文件流中输入的函数 fprintf

1》time

man 2 time

time_t time(time_t *tloc);

如果tloc是空指针,直接返回当前时间。如果tloc 不是空指针,返回当前时间的同时,将返回值赋予tloc指向的内存空间。 

 2》localtime

man 3 localtime

struct tm *localtime(const time_t *timep);

返回值是结构体指针,所指结构体封装着年月日时分秒 

 先看一下这两个函数结合使用的结果


#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    time_t t;//定义一个 time_t 类型的变量,用来存放时间
    struct tm *time_p;//定义一个 tm (时间)结构体类型的指针
    time(&t);//将t转换成从1970年至今的秒数
    printf("秒数: %d\n",t);
    time_p = localtime(&t);//将这个秒数转换成年月日 时分秒的结构体
    printf("当前时间: %d-%d-%d  %d:%d:%d\n", time_p->tm_year + 1900, time_p->tm_mon + 1, time_p->tm_mday, time_p->tm_hour, time_p->tm_min, time_p->tm_sec);//将结构体内容打印出来
return 0;
}

 3》fprintf

int fprintf( FILE *stream, const char *format, ... );

格式化输出到流(stream)文件中,返回值是输出的字符数,发生错误时返回一个负值.

和 printf 的用法相似,只是printf是输出到标准输出中,fprintf是输出到文件流中

4》代码实现 

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    FILE *fp;//定义一个文件流
    char buf[32] = {};//定义一个数组,待用,后面用来计算行数

    fp = fopen("time.txt", "r+");//以r+ 方式(可读可写)打开文件time.txt,文件是自己建立的
    if (NULL == fp)//如果fopen返回NULL; 打开文件失败
    {
        printf("fopen lost\n");
        return -1;
    }
    printf("open success\n\n");

    time_t t;//定义一个 time_t 类型的变量,用来存放时间
    struct tm *time_p;//定义一个 tm (时间)结构体类型的指针
    int line = 0;//定义一个变量来表示行数
    
    //循环fgets读文件, 只要读到就判断是否有\n, 如果有就累加行数
    while (fgets(buf, 32, fp) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')
            line++;//计算当前文件中的行数
    }//这一步的目的是为了当停止一次输入之后,让下一次输入能紧跟在上一次行数继续输入

    while (1)//死循环
    {
        line++;//让行数加一,刚开始行数初始化为0了,所以先加一
        time(&t);//转换成秒数
        time_p = localtime(&t);//转换成年月日时分秒
        fprintf(fp, "%d %d-%d-%d  %d:%d:%d\n", line,time_p->tm_year + 1900, time_p->tm_mon + 1, time_p->tm_mday, time_p->tm_hour, time_p->tm_min, time_p->tm_sec);//将结构体的年月日时分秒输出到文件流中
        fflush(NULL);//强制清空缓存区,输出内容
        sleep(1);//延迟一秒输出
    }

    fclose(fp);//关闭流文件
    return 0;
}

 5》运行结果


今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值