题目要求
编程读写一个文件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
思路:
- 打开文件fopen,循环往文件写内容
- 每隔1s写入一行,sleep(1);
- 计算文件行数,wc -l
- 计算当前时间,转换成年月日、时分秒,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》运行结果
今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!