系统编程-文件操作和时间编程

news2024/11/15 20:39:23

3 文件操作和时间编程

目录

3 文件操作和时间编程

一、时间编程

1、有关时间的shell命令

2、时间API

(1)获取日历时间

(2)将日历时间转化为本地时间

(3)将日历时间转化为格林威治时间

(4)将日历时间直接转化为本地时间字符串

(5)将结构体中的时间按照自己想要的格式显示

(6)将结构体中的时间转化为字符串

二、文件操作

引入

基于缓冲区的和基于非缓冲区的文件操作的区别

1、什么是缓冲区?

2、c 语言学习的文件操作 是基于缓冲区的文件操作

基于非缓冲的文件操作 低级I/O

(1)打开文件

(2)对文件进行写入

(3)对文件进行读取

(4)偏移光标

(5)关闭文件

例题:


一、时间编程

1、有关时间的shell命令

-- data

  • 查看本地时间的指令

    alt text

-- cal

  • 查看日历

    alt text

2、时间API

(1)获取日历时间

-- 日历时间:从 1970.1.1 0:0:0 至现在的一个秒数
-- 函数的头文件

  • #include <time.h>

-- 函数的原型

  • time_t time(time_t *tloc);

-- 函数的作用:

  • 获取日历时间 从 1970.1.1 0:0:0 至现在的一个秒数

-- 函数的参数:

  • time_t *tloc:

-- 获取日历时间的秒数有两种方法

  • (1)传入参数为NULL 空 该参数无用,从返回值中获取秒数
  • (2)传入参数是一个同等类型的地址 会将日历时间放到这个地址中去

-- 函数的返回值:

  • 成功返回: 秒数
  • 失败返回: -1

alt text

(2)将日历时间转化为本地时间

-- 函数头文件

  • #inlcude <time.h>

-- 函数原型

  • struct tm *localtime(const time_t *timep);

-- 函数的作用:

  • 将日历时间转化为本地时间结构体

-- 函数的参数:

  • timep:填写保存日历时间的地址
    -- 填写保存 time 函数获取的日历时间的变量的地址

-- 函数的返回值:

  • 成功返回: 结构体指针 

    alt text

  • 失败返回: NULL

alt text

(3)将日历时间转化为格林威治时间

-- 相差8个小时

-- 函数头文件

  • #include <time.h>

-- 函数原型

  • struct tm *gmtime(const time_t *timep);

-- 函数的作用:

  • 通过日历时间获取格林威治时间

-- 函数的参数:

  • timep:存放日历时间的地址
  • 填写保存 time 函数获取的日历时间的变量的地址

-- 函数的返回值: 成功返回 地址

-- 失败返回 NULL

alt text

(4)将日历时间直接转化为本地时间字符串

-- 函数头文件

  • #include <time.h>

-- 函数原型

  • char *ctime(const time_t *timep);

-- 函数的作用:

  • 将日历时间直接转化为本地时间字符串

-- 函数的参数:

  • timep:存放日历时间的地址 -- 填写保存 time 函数获取的日历时间的变量的地址

-- 函数的返回值:

  • 成功返回 指向字符串的首地址
  • 失败返回 NULL

alt text

(5)将结构体中的时间按照自己想要的格式显示

-- 函数头文件

  • #include <time.h>

-- 函数原型

  • size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

-- 函数功能:

  • 将结构体中的时间按照 format 中的参数进行显示

-- 函数的参数:

  • s:指向用来存放格式化好之后的时间字符串         -- 填写一个 char 类型的数组的首地址
  • max:第一个参数指向的数组的大小
  • format:填写自己想要的时间格式
    -- %F 年-月-日
    -- %T --时间,等于%H:%M:%S

    alt text

  • struct tm *tm: 填写 localtime 的返回值

-- 函数的返回值:

  • 成功返回向数组中放了多少个字节
  • 超过数组大小也返回 0
  • 失败返回 0

alt text

(6)将结构体中的时间转化为字符串

-- 函数头文件

  • #include <time.h>

-- 函数原型

  • char *asctime(const struct tm *tm);

-- 函数的作用:

  • 将结构体中的时间转化为字符串

-- 函数的参数:

  • struct tm *tm:填写 localtime 的返回值
  • 填写 gmtime 的返回值

-- 函数的返回值:

  • 成功 返回 字符串首地址
  • 失败 返回 NULL

alt text

二、文件操作

引入

-- 1)文件:

  • linux 系统有一个十分重要特点:
  • linux 下一切皆是文件

-- 2)文件分类:

  • 七种         - 普通       d 目录       c 字符           s 套节字
  •                 p 管道      b 块设备        l 链接

-- 3)文件操作:

  • C 语言学习的文件操作 是高级 IO
    -- 基于缓冲区的文件操作
  • linux 下的文件操作 是低级 IO
    -- 基于非缓冲区的文件操作
    -- 实时性高
  • -- 4)文件操作流程:
  • 打开-->写入 or 读取-->关闭

基于缓冲区的和基于非缓冲区的文件操作的区别

-- 基于缓冲区的文件操作会将数据先存入缓冲区,直到达到将缓冲区的内容输出的条件,才会将缓冲区的内容输出到文件中
-- 基于非缓冲区的文件操作会将数据直接写入文件中,不经过缓冲区,但是就需要每次输出都要调用cpu,所以效率较低。 -- 实时

1、什么是缓冲区?
  • 缓冲区又称为缓存,是内存空间的一部分。也就是说,计算机在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区。例如:scanf函数。

  • 有时候,从键盘输入的内容,或者将要输出到显示器上的内容,会暂时进入缓冲区,待时机成熟,再一股脑将缓冲区中的所有内容“倒出”,我们才能看到变量的值被刷新,或者屏幕产生变化。

2、c 语言学习的文件操作 是基于缓冲区的文件操作

-- 输入 输出都有缓冲区
-- 缓冲区的输出条件

  • 1 \n
  • 2 程序正常结束
  • 3 满了 缓冲区的大小为 1024 字节
  • 4 fflush()函数

alt text

alt text

alt text

alt text

alt text

alt text

基于非缓冲的文件操作 低级I/O

(1)打开文件

 -- 函数头文件

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>

-- 函数原型

  • int open(const char *pathname, int flags);
  • int open(const char *pathname, int flags, mode_t mode);

-- 函数的作用:

  • 根据函数的参数打开文件并获取文件描述符

-- 函数的参数:

  • pathname:填写要打开的文件的路径名
  • flags:
    -- O_RDONLY 只读
    -- O_WRONLY 只写
    -- O_RDWR 读写
    注:flags 中的参数可以通过 或符号‘|’ 来使用多个选项,前面三个必须有其一
    -- O_TRUNC 清空文件内容
    -- O_APPEND 追加
    -- O_CREAT 创建文件
    注:如果使用了 O_CREAT 这个选项 open 函数需要第三个参数
    例:O_RDONLY | O_APPEND | O_TRUNC | O_CREAT
    -- mode:创建出来的文件权限0777 0664 等
    实际创建的文件权限值为:(mode & ~umask) umask 的值为 0002
    0777 &~0002
    0777 & 0775 = 0775
    -- 函数的返回值:
  • 成功返回 打开文件对应的文件描述符
  • 失败返回 -1 

    alt text

注:文件描述符从 3 开始
因为 0 1 2 已经有文件打开过了

  • 0:标准输入
  • 1:标准输出
  • 2:标准错误
    -- 每使用 open 打开一个文件都会让文件描述符+1

alt text

:文件描述符就代表这个文件,如3就代表3.c

(2)对文件进行写入

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • ssize_t write(int fd, const void *buf, size_t count);

-- 函数的作用:

  • 根据传入的文件描述符进行数据的写入

-- 函数的参数

  • fd:要进行写入数据的文件描述符
  • buf:要进行数据写入的首地址
  • count:要写入多少字节

-- 函数的返回值:

  • 成功 返回实际写入的字节数
  • 失败 返回-1

alt text

(3)对文件进行读取

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • ssize_t read(int fd, void *buf, size_t count);

-- 函数的作用:

  • 从文件描述符中进行数据的读取

-- 函数的参数:

  • fd:要进行读取的文件描述符 打开文件的时候需要读权限
  • buf:用来存放数据的地址
  • count:读取多少个字节

-- 函数的返回值:

  • 成功返回 实际读取到的字节数
  • 失败返回 -1
    -- 如果实际读取的字节数小于我们所需的字节数,说明我们读取到文件末尾了
    -- 返回值为 0 表示光标在文件末尾

alt text

(4)偏移光标

-- 函数头文件

  • #include <sys/types.h>
  • #include <unistd.h>

-- 函数原型

  • off_t lseek(int fd, off_t offset, int whence);

-- 函数的作用:

  • 根据文件描述符和参数进行光标的偏移

-- 函数的参数:

  • fd:要进行偏移光标的文件描述符
  • offset:偏移量
  • whence:SEEK_SET 文件开头
  • SEEK_CUR 当前位置
  • SEEK_END 文件结尾

-- 函数返回值:

  • 成功返回 偏移后光标距离文件开头的字节数
  • 失败返回 -1
(5)关闭文件

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • int close(int fd);

-- 函数的作用:

  • 关闭文件

-- 函数的参数:

  • fd:要进行关闭的文件描述符

-- 函数的返回值:

  • 成功返回 0
  • 失败返回 -1
例题:

-- 通过主函数传参 实现 cp 功能

  • ./a.out 1.c 2.c
  • 把 1.c 的内容复制给 2.c

-- 提示:

  • 通过 open 函数来打开 1.c 和 2.c
  • 如果 1.c 不存在 就是无法复制 ---程序结束
  • 存在 读打开 打开 2.c 创建|清空 写
  • 循环从 1.c 中读取内容 复制到 2.c 中
  • 直到 1.c 文件尾 关闭两个文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define SIZE 4096

int main(int argc, char const *argv[])
{

    if(argc<3)
    {
        printf("缺少参数,请输入参数!\n");
        return -1;
    }
    int fd1 = open(argv[1],O_RDONLY);
    
    if(fd1 == -1)
    {
        perror("open");
        printf("%s 文件不存在,无法复制!\n",argv[1]);
        return -1;
    }
    int fd2 = open(argv[2],O_RDWR |O_TRUNC|O_CREAT,0664);

    char a[SIZE];
    //lseek(fd2, 0, SEEK_SET);
    ssize_t  num = 0;
    
    while(1)
    {
    	num = read(fd1, a, sizeof(a));
    	write(fd2, a, num);
    	if(num<1024)
    	break;
    }
    close (fd1);
    close (fd2);
    printf("复制成功!\n");
    
    return 0;
}

alt text

alt text

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【通过禁用任务管理器实现进程保活】(bat)

效果展示 上代码&#xff0c;球球给我点个关注吧 该程序的操作实际是开启后挂在后台循环100万次 kill掉taskmgr.exe的命令的bat脚本 echo off if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run(""…

git 学习--GitHub Gitee码云 GitLab

1 集中式和分布式的区别 1.1 集中式 集中式VCS必须有一台电脑作为服务器&#xff0c;每台电脑都把代码提交到服务器上&#xff0c;再从服务器下载代码。如果网络出现问题或服务器宕机&#xff0c;系统就不能使用了。 1.2 分布式 分布式VCS没有中央服务器&#xff0c;每台电脑…

基于Java+SpringBoot+Vue的体育馆管理系统的设计与实现

基于JavaSpringBootVue的体育馆管理系统的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&…

JavaScript初级——基础知识

一、JS的HelloWord 1、JS的代码需要编写到script标签中 2、JS的执行是根据语句从上到下一次执行的。 二、JS的编写位置 1、可以将js代码编写到标签的onclick属性中&#xff0c;当我们点击按钮时&#xff0c;js代码才会执行。 2、可以将js代码写在超链接的href属性中&#xff0…

fastzdp_sqlmodel新增get_first和is_exitsts方法

说明 经过fastzdp_login的整合&#xff0c;我们发现&#xff0c;fastzdp_sqlmodel还可以继续封装两个便捷的方法。 get_first&#xff1a;获取查询结果集中的第一条数据is_exitsts&#xff1a;判断数据是否已存在 封装get_first方法 def get_first(engine, model, query_di…

优化算法|牛顿-拉夫逊优化算法(NRBO)详解

算法介绍 本篇推文将介绍一种新的智能优化算法&#xff0c;牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)&#xff0c;该成果由学者Sowmya等人于2024年2月发表于期刊《Engineering Applications of Artificial Intelligence》。文末提供了原文作者的完整代码git…

【python爬虫】邮政包裹物流查询2瑞数6加密

大家好呀&#xff0c;我是你们的好兄弟【星云牛马】&#xff0c;今天给大家带来的是瑞数6的补环境的总结&#xff0c;补环境肯定是需要一些基础补环境知识的&#xff0c;所以建议没有基础的小伙伴可以加入学习群进行学习&#xff0c;有基础的伙伴加入交流起来。 QQ群&#xff…

《向量数据库指南》——AI应用部署落地与权限安全差别

部署落地与权限安全差别 RAG部署有许多系统化优化点 RAG分化程度非常高,因为RAG是许多东西的组成,类似大数据生态,里边有非常多的环节,从数据抓取、数据清洗、数据挖掘,然后预处理,再经过模型分析,比如说embedding模型生成向量,然后再做数据的持久化,serving stack,就…

打卡学习Python爬虫第二天|数据解析Re 正则表达式

在前面的学习中&#xff0c;我们已经基本掌握了抓取整个网页的基本技能&#xff0c;但是在实际的需求当中&#xff0c;我们不需要整个网页的内容&#xff0c;只需要一小部分。这就涉及到数据提取的问题。 三种数据解析的方式&#xff1a;可混合使用 1、re解析 2、bs4解析 3…

无人机低成本集群技术实现详解

在现代科技的迅猛发展中&#xff0c;无人机技术已广泛应用于军事侦察、环境监测、农业植保、物流配送等多个领域。其中&#xff0c;无人机集群技术作为提高任务效率、降低成本的重要手段&#xff0c;正受到越来越多的关注。本项目旨在研发一套低成本无人机集群系统&#xff0c;…

<C语言>指针的深度学习

目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义 2.&数组名与数组名 3.数组指针的使用 四、数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 五、函数指针 六、函数指针数组 七、指向函数指针数组的指针 八、回调函数 1…

微信云开发云存储全部下载

一、安装 首先按照这个按照好依赖 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 二、登录 tcb login 下载 首先在你要下载到的本地文件内创建一个名为&#xff1a;cloudbaserc.json 的json文件。 填入你的id {"envId":"你的云开发环…

STM32基础篇:定时器 × 时基单元

定时器简介 定时器是一种专门负责定时功能的片上外设。F1系列的单片机最多有14个定时器&#xff08;TIM1~TIM14&#xff09;&#xff0c;具体如下表&#xff1a; 类型外设名称基本定时器TIM6和TIM7通用定时器TIM2~TIM5和TIM9~TIM14高级定时器TIM1和TIM8 基本定时器是功能最简…

Chrome浏览器无法打开无痕模式的解决方案

1.在设置---关于Chrome里面进行升级&#xff0c;升级到最新版本 2.windowsR打开运行输入regedit打开注册表 3、在HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome下面找到IncognitoModeAvailability将值修改为0,重新打开浏览器即可打开无痕模式

【SpringBoot】SpringBoot 中 Bean 管理和拦截器的使用

目录 1.Bean管理 1.1 自定义Bean对象 1.2 Bean的作用域和生命周期 2.拦截器的使用 1.Bean管理 默认情况下&#xff0c;Spring项目启动时&#xff0c;会把我们常用的Bean都创建好放在IOC容器中&#xff0c;但是有时候我们自定义的类需要手动配置bean&#xff0c;这里主要介绍…

掌握这三种方法,让你快速获取商品信息,数据采集不再难

摘要&#xff1a; 面对琳琅满目的天猫商品&#xff0c;如何迅速精准地获取所需信息成为电商竞争的关键。本文揭秘三种实战技巧&#xff0c;助你在数据采集路上快人一步&#xff0c;让繁琐的数据收集变得轻而易举。 一、如何在信息海洋中&#xff0c;快速捞取天猫商品的“珍宝…

wifi密码字典之8位纯数字

最近研究网络安全&#xff0c;对无线网络进行渗透测试&#xff0c;用了kali linux和ubuntu linux&#xff0c;比较了几个抓包与分析工具&#xff0c;最终选择了aircrack-ng&#xff0c;同样的流程用已知的wifi密码测试通过&#xff0c;对网络安全渗透测试要用到密码字典&#x…

midwayjs 无法启动 无任何日志和报错

比如我的mqtt&#xff0c;原本是直接 imports:[mqtt]&#xff0c;但无法启动 无任何日志和报错 解决直接 this.app.addConfigObject(mqtt) addConfigObject作用&#xff1a;将 MQTT 配置添加到应用的配置中。addConfigObject 方法允许你在应用初始化完成后动态地添加或更新应…

Ubuntu 添加 GitLab 官方仓库报错“curl is unable to connect to packagecloud.io over TLS”

Ubuntu 安装 Gitlab 报错“curl is unable to connect to packagecloud.io over TLS” 1 现象2 问题排查3 解决方案4 验证 1 现象 Ubuntu 上添加 GitLab 官方仓库时报错“……curl is unable to connect to packagecloud.io over TLS……” 2 问题排查 终端提示中给出两种可…

复现nnUNet2并跑通自定义数据

复现nnUNet2并跑通自定义数据 1. 配置环境2. 处理数据集2.1 创建文件夹2.2 数据集格式转换2.3 数据集预处理 3. 训练 1. 配置环境 stage1&#xff1a;创建python环境&#xff0c;这里建议python3.10 conda create --n nnunet python3.10 conda activate nnunet stage2&#x…