C语言复习之直接向文件中写入和读取时间Date对象

开发环境:Window10,CLion

1.声明

当前内容主要为本人学习和复习之用,主要为fwrite方式写入和读取时间的操作

主要为

  1. 使用fwrite向文件中写入结构类型数据
  2. 使用fread读取文件中的结构类型数据(循环读取)

2.demo

Date.h

#ifndef CRESTUDY_DATE_H
#define CRESTUDY_DATE_H

typedef struct Date {
    struct tm *local;
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
} Date;
#endif //CRESTUDY_DATE_H

主要main.c

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "heads/Date.h"

// 当前的格式
char *get_date_format() {
    return "%.4d/%.2d/%.2d %.2d:%.2d:%.2d";
}

// 将系统时间类型转换为自定义的Date结构
struct Date convertToDate(struct tm *local) {
    Date date;
    date.year = local->tm_year + 1900;
    date.month = local->tm_mon + 1;
    date.day = local->tm_mday;
    date.hour = local->tm_hour;
    date.minute = local->tm_min;
    date.second = local->tm_sec;
    return date;
}

// 获取当前的时间
struct Date get_current_time() {
    time_t t;
    struct tm *local;
    time(&t);
    local = localtime(&t);
    return convertToDate(local);;
}

// 使用输出日期类型数据
void printf_date(Date date){
    printf(get_date_format(),date.year,date.month,date.day,date.hour,date.minute,date.second);
    printf("\n");
}

// 读取时间对象
void readDateObject(char *path){
    FILE *read=fopen(path, "r");
    if(read==NULL)
    {
        printf("读书的文件不存在");
        //exit(-1);
        return;
    }
    Date date;
    while(fread(&date,sizeof(struct Date),1,read)){ // 直接循环读取Date类型数据
        int ch = fscanf(read,"\n"); // 其中必须读取分隔符
        //printf("ch == %c\n",ch);
        printf_date(date); // 打印出当前的日期对象
    }
     // 其中1表示该Date类型的数量
    fclose(read);

}

// 向文件中追加写入Date类型数据
void writeDateObject(char *path){
    FILE *write=fopen(path, "a");
    if(write==NULL)
    {
        printf("写入的文件不存在");
        //exit(-1);
        return;
    }
    struct Date date=get_current_time();

    fwrite(&date,sizeof(struct Date),1,write);
    fprintf(write, "\n");
    fclose(write);
}

int main()
{
    char path[]="../resources/time_bin.bin";
    writeDateObject(path);
    puts("写入当前日期信息成功");
    puts("读取当前日期信息成功");
    readDateObject(path);
    // 写入数据没有问题

    return 0;
}

3.测试

在这里插入图片描述
在这里插入图片描述
测试成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是DS1302倒计时的C语言编程代码,包括DS1302写入读取操作的程序: ```c #include <reg52.h> #include <intrins.h> // 定义DS1302的IO口 #define DS1302_SCLK P2_0 #define DS1302_IO P2_1 #define DS1302_RST P2_2 // 定义DS1302的控制字节 #define DS1302_SECONDS 0x80 #define DS1302_MINUTES 0x82 #define DS1302_HOURS 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTH 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_CONTROL 0x8E #define DS1302_CHARGER 0x90 #define DS1302_CLKBURST 0xBE #define DS1302_RAMSTART 0xC0 #define DS1302_RAMEND 0xFC // 定义DS1302的写入读取操作函数 void DS1302_WriteByte(unsigned char addr, unsigned char dat); unsigned char DS1302_ReadByte(unsigned char addr); // 定义DS1302的初始化函数 void DS1302_Init(); // 定义DS1302的倒计时函数 void DS1302_Countdown(unsigned char minute); // 定义延时函数 void Delay(unsigned int n); // 主函数 void main() { DS1302_Init(); // 初始化DS1302 while(1) { DS1302_Countdown(1); // 进行1分钟的倒计时 } } // DS1302写入操作函数 void DS1302_WriteByte(unsigned char addr, unsigned char dat) { unsigned char i; // 先将DS1302的RST置低 DS1302_RST = 0; Delay(1); // 先发送地址 for(i=0; i<8; i++) { DS1302_SCLK = 0; DS1302_IO = addr & 0x01; addr >>= 1; DS1302_SCLK = 1; } // 再发送数据 for(i=0; i<8; i++) { DS1302_SCLK = 0; DS1302_IO = dat & 0x01; dat >>= 1; DS1302_SCLK = 1; } // 最后将DS1302的RST置高 DS1302_RST = 1; } // DS1302读取操作函数 unsigned char DS1302_ReadByte(unsigned char addr) { unsigned char i, dat = 0; // 先将DS1302的RST置低 DS1302_RST = 0; Delay(1); // 先发送地址 for(i=0; i<8; i++) { DS1302_SCLK = 0; DS1302_IO = addr & 0x01; addr >>= 1; DS1302_SCLK = 1; } // 再读取数据 for(i=0; i<8; i++) { DS1302_SCLK = 0; dat >>= 1; if(DS1302_IO) dat |= 0x80; DS1302_SCLK = 1; } // 最后将DS1302的RST置高 DS1302_RST = 1; return dat; } // DS1302初始化函数 void DS1302_Init() { // 先关闭写保护 DS1302_WriteByte(DS1302_CONTROL, 0x00); // 设置12小时制 DS1302_WriteByte(DS1302_HOUR, 0x80); // 设置日期时间 DS1302_WriteByte(DS1302_YEAR, 0x20); DS1302_WriteByte(DS1302_MONTH, 0x02); DS1302_WriteByte(DS1302_DATE, 0x01); DS1302_WriteByte(DS1302_DAY, 0x01); DS1302_WriteByte(DS1302_HOUR, 0x12); DS1302_WriteByte(DS1302_MINUTE, 0x00); DS1302_WriteByte(DS1302_SECOND, 0x00); // 最后再次打开写保护 DS1302_WriteByte(DS1302_CONTROL, 0x80); } // DS1302倒计时函数 void DS1302_Countdown(unsigned char minute) { unsigned char seconds = 0; // 先将DS1302的RST置低 DS1302_RST = 0; Delay(1); // 先发送地址 DS1302_SCLK = 0; DS1302_IO = DS1302_CLKBURST; DS1302_SCLK = 1; // 再读取数据 seconds = DS1302_ReadByte(DS1302_SECONDS); // 最后将DS1302的RST置高 DS1302_RST = 1; // 进行倒计时 while(minute > 0) { Delay(60000); seconds--; if(seconds == 0xFF) { seconds = 59; minute--; } // 先将DS1302的RST置低 DS1302_RST = 0; Delay(1); // 先发送地址 DS1302_SCLK = 0; DS1302_IO = DS1302_SECONDS; DS1302_SCLK = 1; // 再写入数据 DS1302_WriteByte(DS1302_SECONDS, seconds); // 最后将DS1302的RST置高 DS1302_RST = 1; } } // 延时函数 void Delay(unsigned int n) { unsigned int i, j; for(i=0; i<n; i++) { for(j=0; j<123; j++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } ``` 以上代码,DS1302_WriteByte()函数用于向DS1302写入数据,DS1302_ReadByte()函数用于从DS1302读取数据,DS1302_Init()函数用于初始化DS1302,DS1302_Countdown()函数用于进行倒计时,Delay()函数用于延时。 需要注意的是,在使用DS1302时,需要先关闭写保护,然后再进行写入操作,最后再打开写保护。此外,DS1302的数据读取需要使用DS1302时钟突发读取命令,即先发送DS1302_CLKBURST命令,然后再读取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值