day 27 日志文件(枚举,时间函数),目录io,多文件管理

0## 1.获得当前时间

# include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{struct tm* ptm;time_t sec = time(NULL);ptm = localtime(&sec);printf("%d-%d-%d %d:%d:%d\n",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
}

2 .枚举

可以直接定义枚举变量,结构体也可以
在这里插入图片描述

3 封装日志模块

在这里插入图片描述

要点

1.对于多个全局变量直接用结构体封装到头文件中
2.学会使用枚举,用枚举数据类型接收来的是数字,一般创建一个字符串数组,传过来的枚举成员作下标,如下。

*******c文件*****************
#include "log.h"
#include <sys/stat.h>
#include <sys/types.h>log_s log_g;//全局结构体变量
int init_log()//初始化函数
{struct tm *ptm = NULL;time_t sec = time(NULL);ptm = localtime(&sec);log_g.time = *ptm;char filename[256] = {0};//村名字进去不能用char*mkdir("LOG",0777);//创建目录sprintf(filename,"./LOG/log%d-%02d-%02d%.txt",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday);//在LOG目录下创建文件log_g.fp = fopen(filename,"a");if(log_g.fp == NULL){printf("fopen fail!\n");return -1;}return 0;}int write_log(log_lev lev,char *str)
{time_t sec = time(NULL);struct tm *ptm = NULL;ptm = localtime(&sec);if(ptm->tm_mday != log_g.time.tm_mday)// if(ptm->tm_min != log_g.time.tm_min){deinit_log();init_log();}char *leves[3] = {"LOG_INFO","LOG_WARN","LOG_ERR"};//由于枚举成员本质是整数,传递不了他代表的字符串,创建字符串数组,用枚举常量表示下标;fprintf(log_g.fp,"[%d-%d-%d %d:%d;%d][%s]%s\n",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec,leves[lev],str);fflush(log_g.fp);return 0;
}void deinit_log()
{fclose(log_g.fp);
}

*****h文件

#ifndef __LOG_H__
#define __LOG_H__
#include<stdio.h>
#include<time.h>typedef enum 
{LOG_INFO,LOG_WARN,LOG_ERR,
}log_lev;typedef struct //多个全局变量直接在.h文件中构建结构体
{FILE *fp;struct tm time;
}log_s;
extern int init_log();
extern int write_log(log_lev lev , char *str);
extern void deinit_log();
#endif

main函数

#include "log.h"
#include <stdio.h>
#include<unistd.h>//sleepint main(int argc , const char *grgv[])
{init_log();write_log(LOG_INFO,"日志模块初始化成功!");while(1){write_log(LOG_ERR,"XXX文件打开失败!");sleep(1);write_log(LOG_WARN,"XXX文件为空!");sleep(1);}deinit_log();return 0;}

4 打印出错信息

1.strerror(errno)
2.perror
在这里插入图片描述

3 error

error可以给出更详细的错误信息哪一个文件哪个函数哪一行。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

目录IO

目录文件 ----> 目录流指针 ----> 提供给相关函数操作 01-打开目录 --opendir
02-读目录   --readdir
03-关闭目录 --closedir 1.opendir
DIR *opendir(const char *name);
功能:打开一个目录获得一个目录流指针
参数:name:目录名
返回值:成功返回目录流指针失败返回NULL2.readdir
struct dirent *readdir(DIR *dirp);
功能:从目录流中读取文件信息并将保存信息的结构体地址返回
参数:dirp:目录流指针
返回值:包含文件信息的结构体出错或者读到目录流末尾返回NULLOn Linux, the dirent structure is defined as follows:struct dirent {ino_t          d_ino;       /* inode number */off_t          d_off;       /* offset to the next dirent */unsigned short d_reclen;    /* length of this record */unsigned char  d_type;      /* type of file;not supportedby all file system types */char           d_name[256]; /* filename */};3、关闭目录 int closedir(DIR *dirp);功能:关闭之前已经打开的目录流对象参数:opendir的返回结果中目录流对象返回值:成功  0失败   -1

会读目录。一般目录下有隐藏文件

多文件管理

makefilemakefile文件用于管理和组织代码工程的编译和链接,被make工具解析并完成相关动作make:工程管理工具
make makefileMakefile 语法:要生成的文件:依赖的所有文件生成方式app:main.c add.c sub.cgcc main.c add.c sub.c -o app -I./include -lm	变量:1.自定义变量OBJ=OBJ+=SRC=CC=OBJ=app	SRC=main.c SRC+=add.c SRC+=sub.cCC=gccINCLUDE=./includeFLAG=-lm$(OBJ):$(SRC)$(CC) $(SRC) -o $(OBJ) -I$(INCLUDE) $(FLAG)2.系统变量$@:要生成的文件名(目标文件) a.out$^:所有依赖的文件            xxx.c$<:第一个依赖的文件$(OBJ):$(SRC)$(CC) $^ -o $@ -I$(INCLUDE).PHONY:clean:rm $(OBJ)make:生成目标文件make clean:删除目标文件(或者多余文件)3.时间戳:编译文件时,时间戳更新的文件需要重新加入编译,时间戳没有改变的不需要重新编译 1)预处理:gcc -E test.c -o test.i 对预编译指令都做相应的处理2)编译:gcc -S test.i -o test.s 编译成汇编指令代码3)汇编:gcc -c test.s -o test.o 将汇编指令代码转化为目标文件4)链接:gcc test.o -o test 将目标文件与库文件(静态库或动态库)链接得到可执行文件。gcc -c test.c -o test.o    将源代码转化为目标文件gcc -c main.c -o main.ogcc main.o test.o -o appOBJ=appSRC=main.o add.oCC=gcc$(OBJ):$(SRC)$(CC) $^ -o $@main.o:main.c$(CC) -c $^ -o $@                                                                      add.o:add.c$(CC) -c $^ -o $@clean:rm $(OBJ) $(SRC)======>%.o:%.c$(CC) -c $^ -o $@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2360.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Flink-JDBC将数据同步到Doris

在现代数据分析和处理环境中&#xff0c;数据同步是一个至关重要的环节。Apache Flink和Doris是两个强大的工具&#xff0c;分别用于实时数据处理和大规模并行处理&#xff08;MPP&#xff09;SQL数据库。本文将介绍如何使用Flink-JDBC连接器将数据同步到Doris。 一、背景介绍…

【python】OpenCV—Local Translation Warps

文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 利用液化效果实现瘦脸美颜 交互式的液化效果原理来自 Gustafsson A. Interactive image warping[D]. , 1993. 2、原理分析 上面描述很清晰了&#xff0c;鼠标初始在 C&#xff0c;也即…

灵活妙想学数学

灵活妙想学数学 题1&#xff1a;海星有几只&#xff1f; 一共有12只海洋生物&#xff0c;分别是5只脚的海星&#xff0c;8只脚的章鱼和10只脚的鱿鱼&#xff0c;这些海洋动物的脚一共有87只&#xff0c;每种生物至少有1只&#xff0c;问海星有几只&#xff1f; 解&#xff1a…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…

编译pytorch——cuda-toolkit-nvcc

链接 https://blog.csdn.net/wjinjie/article/details/108997692https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#switching-between-driver-module-flavorshttps://forums.developer.nvidia.com/t/can-not-load-nvidia-drivers-on-ubuntu-22-10/239750https://…

如何发布自己的第一个Chrome扩展程序

如何发布自己的Chrome扩展程序 只需要六步即可完成Chrome扩展程序的发布 &#xff08;1&#xff09;首先打开google chrome 应用商城注册开发者账号的页面 &#xff08;2&#xff09;现在进行一个绑卡支付5美元的一次性注册费用即可。【不知道如何绑卡的支付的&#xff0c;文…

SpringBoot入门实现简单增删改查

本例子的依赖 要实现的内容 通过get、post、put和delete接口,对数据库中的trade.categories表进行增删改查操作。 目录结构 com.test/ │ ├── controller/ │ ├── CateController.java │ ├── pojo/ │ ├── dto/ │ │ └── CategoryDto.java │ ├─…

electron 如何申请 Mac 系统权限

对于一些使用 Electron开发的app, 需要获取一些系统权限,比如录屏权限, 获取摄像头权限,麦克风等等,类似于以下界面: 那么Electron App 应该如何申请呢? 首先我们明确一下macOS中基础权限的分类,可以分为以下几种: 隐私权限(Private Permissions) : <!-- entitlements.ma…

浅谈云计算02 | 云计算模式的演进

云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

AI智能体实战|使用扣子Coze搭建AI智能体,看这一篇就够了(新手必读)

有朋友看到我使用Coze搭建的AI智能体蛮实用的&#xff0c;也想自己尝试一下。那今天我就分享一下如何使用Coze&#xff08;扣子&#xff09;搭建AI智能体&#xff0c;手把手教学&#xff0c;流程超级详细&#xff0c;学会了的话&#xff0c;欢迎分享转发&#xff01; 一、搭建A…

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序&#xff0c;可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时&#xff0c;它们的具体执行顺序是不确定的&#xff0c;除非我们使用同步机制&#xff08;如 lock、信号量等&am…

nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控

我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时&#xff0c;我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx&#xff0c;可以通过以下命令进行安装&#xff08;以 Ubuntu 为例&#xff0…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

Linux之进程

Linux之进程 一.进程进程之形ps命令进程状态特殊进程孤儿进程守护进程 进程创建之创建子进程进程特性优先级进程切换&#xff08;分时操作系统&#xff09; 二.环境变量三.进程地址空间四.进程终止&进程等待五.进程替换六.自定义shell 本篇博客希望简略的介绍进程&#xff…

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单

在AI智能中有几种重要的神经网络类型?6种重要的神经网络类型分享!

神经网络今天已经变得非常流行&#xff0c;但仍然缺乏对它们的了解。一方面&#xff0c;我们已经看到很多人无法识别各种类型的神经网络及其解决的问题&#xff0c;更不用说区分它们中的每一个了。其次&#xff0c;在某种程度上更糟糕的是&#xff0c;当人们在谈论任何神经网络…

业务幂等性技术架构体系之消息幂等深入剖析

在系统中当使用消息队列时&#xff0c;无论做哪种技术选型&#xff0c;有很多问题是无论如何也不能忽视的&#xff0c;如&#xff1a;消息必达、消息幂等等。本文以典型的RabbitMQ为例&#xff0c;讲解如何保证消息幂等的可实施解决方案&#xff0c;其他MQ选型均可参考。 一、…

【C语言】线程----同步、互斥、条件变量

目录 3. 同步 3.1 概念 3.2 同步机制 3.3 函数接口 1. 同步 1.1 概念 同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情 1.2 同步机制 通过信号量实现线程间的同步 信号量&#xff1a;通过信号量实现同步操作&#xff1b;由信号量来决定…