嵌入式学习Day19---Linux软件编程

news2024/11/23 23:18:18

目录

一、标准I/O

1.1.fseek

        1.偏移量

        2.实例

 ​编辑

1.2.ftell 

        2.实例

 ​编辑

二、文件I/O 

        2.1.打开文件

                1.open

        2.2.实例 

        2.2.读写文件

                1.write

                实例

 ​编辑

                2.read 

         实例

        2.3.关闭文件

                1.close

         2.3.lseek       

                实例

三、标准I/O与文件I/O的区别

3.1.区别 

四、其余函数接口

4.1.fileno

4.2.fdopen

4.3.feof

4.4.ferror 

4.5.clearerr 

五、Linux中时间的获取 

5.1.time

5.2.localtime 

        默认的结构体 

 5.3.mktime

5.4.实例

        1.获取实时时间

        2.将日历时间转化位1907年1月1日到2024年8月1日19:32的秒数 

五、总结


 

一、标准I/O

1.1.fseek

        1.偏移量

                读和写都是在偏移量的位置上进行的 

int fseek(FILE *stream, long offset, int whence);
    功能:
        设置流的偏移量
    参数:
        stream:文件流指针
        offset:偏移量 
        whence:
            SEEK_SET        文件开头
            SEEK_CUR        当前位置
            SEEK_END        文件结尾
    返回值:
        成功返回当前偏移量
        失败返回-1 

        2.实例

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;

    fp = fopen("a.txt", "w");
    if(fp == NULL)
    {
        return -1;
    }

    fseek(fp, 5, SEEK_SET);
    fputc('a', fp);

    fseek(fp, -2, SEEK_END);
    fputc('B', fp);

    fseek(fp, 5, SEEK_CUR);
    fputc('c', fp);

    fclose(fp);

    return 0;
}

 

1.2.ftell 

         获取流的偏移量(文件大小)

        2.实例

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    long len = 0;

    fp = fopen("/usr/include/stdio.h", "r");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    fseek(fp, 0, SEEK_END);
    len = ftell(fp);
    printf("len = %ld\n", len);

    fclose(fp);

    return 0;
}

 

二、文件I/O 

        2.1.打开文件

                1.open

                        要加入头文件

                         #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 三个其中之一
            O_CREAT         文件不存在创建
            O_TRUNC         文件存在清0 
            O_APPEND        追加 
            O_EXCL          文件存在报错 
            O_NONBLOCK      非阻塞 
            O_ASYNC         异步IO 
            ..
        mode:权限
            只要有O_CREAT标识,表示需要加上权限:
            rwx rwx rwx 
            rw- rw- r-- 
            110 110 100
        0   6   6   4
    返回值:
        成功返回文件描述符
        失败返回-1  

        文件描述符:很小的非负整数,而且新的文件描述符总是尚未被使用的最小的非负整数

        2.2.实例 

         与"r"等价

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_RDONLY);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }
    



    return 0;
}

        与r+等价

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_RDWR);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }
    

    return 0;
}

        与w等价

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }
    

    return 0;
}

        与w+等价

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_RDWR | O_CREAT | O_TRUNC, 0664);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }
    
    return 0;
}

        与a等价

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_WRONLY | O_CREAT | O_APPEND, 0664);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }

    return 0;
}

        与a+等价 

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

int main(void)
{
    int fd = 0;

    fd = open("a.txt", O_RDWR | O_CREAT | O_APPEND, 0664);

    if(fd == -1)
    {
        perror("open failed");
        return -1;
    }
    
    return 0;
}

        2.2.读写文件

                1.write

ssize_t write(int fd, const void *buf, size_t count);
   功能:
    向文件描述符中写入buf开始的count个字节 
   参数:
    fd:文件描述符 
    buf:写入的数据 
    count:写入的字节数 
   返回值:
    成功返回写入的字节数 
    失败返回-1
                实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    int fd = 0;
    char strbuffer[256] = {"how are you"};
     
    fd = open("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if(fd == 0)
    {
        perror("open failed");
        return -1;
    }

    write(fd, "hello world", 11);
    write(fd, strbuffer, strlen(strbuffer));

    close(fd);

    return 0;
}
 

                2.read 

ssize_t read(int fd, void *buf, size_t count);
   功能:
    从文件描述符中读取数据到buf开始的空间中,最多读取count个字节 
   参数:
    fd:文件描述符 
    buf:存放数据空间首地址 
    count:最多读取的字节数 
   返回值: 
    成功返回读取的字节数
    读到文件末尾返回0  
    失败返回-1
         实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd = 0;
    char strbuffer[128] = {0};
    ssize_t ret = 0;

    fd = open("a.txt", O_RDONLY);
    if(fd == 0)
    {
        perror("");
        return -1;
    }

    ret = read(fd, strbuffer, sizeof(strbuffer));

    printf("读到了%ld个字节\n", ret);
    printf("内容为:%s\n", strbuffer);

    close(fd);


    return 0;
}

 

        2.3.关闭文件

                1.close

                      需要加入

                        #include <unistd.h> 

                        关闭文件符

 int close(int fd);
   功能:
     关闭文件描述符
     成功返回0 
     失败返回-1  

         2.3.lseek       

 off_t lseek(int fd, off_t offset, int whence);
   功能:
        修改文件描述符对应的偏移量
   参数:
        fd:文件描述符 
        offset:偏移量 
        whence:
            SEEK_SET:从文件开头开始偏移
            SEEK_CUR:从当前位置开始偏移
            SEEK_END:从文件末尾开始偏移
   返回值: 
        成功返回当前的偏移量
        失败返回-1  
                实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd = 0;
    char c = 0;
    off_t len = 0;

    fd = open("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if(fd == 0)
    {
        perror("");
        return -1;
    }

    len = lseek(fd, 10, SEEK_SET);
    c = 'a';
    write(fd, &c, 1);
    printf("len = %ld\n", len);

    len = lseek(fd, -5, SEEK_CUR);
    c = 'b';
    write(fd, &c, 1);
    printf("len = %ld\n", len);

    lseek(fd, 0, SEEK_SET);
    c = 'c';
    write(fd, &c, 1);
    printf("len = %ld\n", len);

    close(fd);



    return 0;
}

 

三、标准I/O与文件I/O的区别

    fopen                 ->          open
    
    fgetc/fputc           ->          read/write  
    fgets/fputs
    fscanf/fprintf
    fread/fwrite

    fclose                ->          close 

    fseek                 ->          lseek 
    rewind 
    ftell 

3.1.区别 

    1.标准IO是库函数
    2.文件IO是系统调用 
    3.标准IO是针对于文件IO的封装
    4.标准IO是有缓存的
    5.文件IO是没有缓存的
    6.标准IO主要用于操作普通文件
    7.文件IO可以操作设备文件、进程间通信的文件、普通文件(Linux系统下的一切文件均可以使用文件IO)

 

    库函数:是针对于系统调用的封装,可以在Windows或者Linux系统中使用
    系统调用:是Linux内核中的函数接口,只能在Linux系统中使用 

四、其余函数接口

4.1.fileno

标准IO  ->  文件IO  
       int fileno(FILE *stream);
       功能:
         获得文件流指针对应的文件描述符  

4.2.fdopen

文件IO -> 标准IO 
       FILE *fdopen(int fd, const char *mode);
       功能: 
         通过文件描述符获得文件流指针

4.3.feof

         检测是否读到文件末尾 

4.4.ferror 

        检测是否出错 

4.5.clearerr 

        清楚错误
 

五、Linux中时间的获取 

5.1.time

 time_t time(time_t *tloc);
      功能:
        返回1970年1月1日到现在的秒数
      参数:
        tloc:存放秒数空间的首地址
      返回值: 
        成功返回1970年1月1日到现在的秒数
        失败返回-1

5.2.localtime 

        求实时日历的时间

struct tm *localtime(const time_t *timep);
      功能:
        将秒数转换为本地时间
      参数:
        timep:存放秒数空间的首地址
      返回值: 
        成功返回本地时间
        失败返回NULL

        默认的结构体 

 struct tm {
            int tm_sec;    /* Seconds (0-60) */
            int tm_min;    /* Minutes (0-59) */
            int tm_hour;   /* Hours (0-23) */
            int tm_mday;   /* Day of the month (1-31) */
            int tm_mon;    /* Month (0-11) */
            int tm_year;   /* Year - 1900 */
            int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
            int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
            int tm_isdst;  /* Daylight saving time */
        };

 5.3.mktime

        可以用来求时间段的差时

 time_t mktime(struct tm *tm);
      功能:    
        根据日历时间转换为1970年1月1日到现在的秒数  

5.4.实例

        1.获取实时时间

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

int main(void)
{
    time_t t;
    struct tm *ptime = NULL;

    while(1)
    {
        time(&t);
        ptime = localtime(&t);
        printf("%04d-%02d-%02d %02d:%02d:%02d\r", ptime->tm_year+1900, ptime->tm_mon+1, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec);
        fflush(stdout);
        sleep(1);
    }


    return 0;
}    

 

        2.将日历时间转化位1907年1月1日到2024年8月1日19:32的秒数 

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

int main(void)
{
   
    time_t t;
    struct tm *ptm = NULL;
    struct tm tmp;

    tmp.tm_hour = 19;
    tmp.tm_min = 32;
    tmp.tm_sec = 0;
    tmp.tm_year = 2024-1900;
    tmp.tm_mon = 8-1;
    tmp.tm_mday = 1;
    t = mktime(&tmp);
    printf("t = %ld\n", t);

    t = time(NULL);
    printf("t = %ld\n", t);

    return 0;
}    

 

五、总结

        2024年8月1日,今天时学习的19天,时间飞逝。今天将标准IO的函数接口学完了,并且学了一大半的文件IO的接口。今天最有意思的加上学了Linux上如何求实时时间,很有意思很有收获。

        加油!

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

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

相关文章

2024年有哪些开放式耳机值得入手?精选五大高分品牌

近几年兴起的开放式蓝牙耳机&#xff0c;具有佩戴舒适稳固、不影响使用者判断外界环境等优点&#xff0c;十分适合在户外环境下使用&#xff0c;因此受到了众多健身人士的喜爱。那么该如何挑选到一款适合自己的开放式耳机呢&#xff1f;2024年有哪些开放式耳机值得入手&#xf…

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护&#xff0c;更多的会想到阿里的sentinel&#xff0c;手段丰富&#xff0c;应用简单。sentinel的限流、降级、熔断&#xff0c;可以自己去试一下&#xff0c;sentinel主要通过配置实现功能&#xff0c;不难。sentinel的简介放…

Qt如何在工程中使用dll库

DEMO&#xff1a;Test &#xff1b;工程与dll皆为qmake编译&#xff1b; 所需文件&#xff1a;A.dll、A.lib、A.h、A_global.h&#xff1b;B.dll。其中A.dll 依赖 B.dll 1. 环境配置 &#xff08;1&#xff09;确认制作dll的Qt版本和当前工程版本是否一致(Qt6中的一些函数Qt…

SLAM中的概率基础(知识回顾)

今天有些知识点忘记了&#xff0c;特地过来回顾一下&#xff0c;于是就做了这些笔记。 为了方便能够在手机上更直观的看笔记&#xff0c;写下这篇文章&#xff0c;有错误请各位大佬指出。 一、 概率基础概念 1.1. 概率密度函数&#xff08;PDF&#xff09; 概率密度函数用于…

第十九次(安装nginx代理tomcat)

回顾 1.安装nodejs---jdk一样你的软件运行环境 yum -y list install|grep epel $? yum -y install nodejs #版本号 node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config ...淘宝镜像 3.安装vue/cli command line interface 命令行接口 npm ins…

推荐4个国内可用的AI软件,用上以后都能早点下班

随着技术的发展&#xff0c;越来越多的AI软件出现在人们的视野&#xff0c;应用的领域更多&#xff0c;能力提升也更快&#xff0c;用在工作上能帮不少忙。下面就给大家分享4个国内可以直接使用的AI软件&#xff0c;希望大家啊用上以后都能早点下班~ 1.Kimi 一键直达>>h…

韶音开放式耳机怎么样?韶音、西圣、QCY热门款实测横评

开放式耳机是目前最火爆的的耳机市场细分赛道&#xff0c;开放式耳机的优点包括健康卫生&#xff0c;佩戴舒适性高&#xff0c;方便我们接收外部环境音等等&#xff0c;以上这些优势使得开放式耳机特别适配户外运动场景&#xff0c;在工作、日常生活等场景下使用也是绰绰有余。…

Day81 代码随想录打卡|贪心算法篇---跳跃游戏 II

题目&#xff08;leecode T45&#xff09;&#xff1a;给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j…

亚马逊新产品怎么快速提升销量

经常有卖家吐槽新产品没销量&#xff0c;但卖家们的吐槽并不能把问题解决&#xff0c;南哥和大家分享一下关于测评的好处和一些技巧&#xff0c;以及如何样做才能提高店铺销量&#xff0c;将运营和测评结合起来做 测评的好处: 提升店铺信誉&#xff0c;制造爆款&#xff0c;增…

DjangoRF-12-创建testcases子应用--测试套件模块

models–serializers-permission-views-urls 1、创建models&#xff0c; class TestSuit(BaseModel): name models.CharField(测试套件名称, max_length200, help_text测试套件名称) task models.ForeignKey(Task, verbose_name测试任务, on_deletemodels.PROTECT,help_tex…

揭秘MITM攻击:原理、手法与防范措施

中间人攻击发生时&#xff0c;攻击者会在通讯两端之间插入自己&#xff0c;成为通信链路的一部分。攻击者可以拦截、查看、修改甚至重新定向受害者之间的通信数据&#xff0c;而不被双方察觉。这种攻击常见于未加密的Wi-Fi网络、不安全的HTTP连接或者通过社会工程学手段诱导受害…

C++基础语法:函数探幽(一)内联函数,默认参数,函数重载

前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 引入 <C Prime Plus> 6th Edition(以下称"本书")第8章内容解读 内联函数 1>本书P253--8.1节C内联函数第二…

数据库事务处理技术——故障恢复

1. 数据故障恢复的宏观思路 我们知道DBMS是利用内存&#xff08;主存&#xff09;和外存&#xff08;辅存&#xff09;这样的存储体系进行数据库的管理&#xff0c;其中内存也就是我们常说的缓存是易失的。而事务时DBMS对数据库进行控制的基本单元&#xff0c;宏观上是由程序设…

函数、预解析、参数、参数列表、抛出异常、捕获异常

函数 命名函数 匿名函数 构造函数 纯函数 预解析 关键字var和function开头的语句块提前进行处理 处理过程&#xff1a;当变量和函数的声明处在作用域比较靠后的位置的时候&#xff0c;变量和函数的声明会被提升到作用域的开头。 解释代码和执行代码 因为是在所有代码执行之…

【软件建模与设计】-07-静态建模

目录 1、类之间关系 1.1、关联 1.1.1、关联的多重性 1.1.2、三元关联 1.1.3、一元关联 1.1.4、关联类 2、组合与聚合层次 2.1、组合 2.2、聚合 3、泛化/特化层次 4、约束 5、静态建模和UML 5.1、问题域的静态建模 6、系统上下文的静态建模 7、使用UML构造型对类…

JAVA Spring学习Day1

Maven Maven配置&#xff1a; Maven是Java项目的构建工具&#xff0c;使用pom.xml配置文件管理项目依赖、插件和构建目标。Spring Boot项目搭建&#xff1a; Spring Boot是基于Spring框架的快速开发框架&#xff0c;通过约定大于配置的理念简化了Spring应用的搭建和开发。 …

C# 设计模式之原型模式

总目录 前言 在软件系统中&#xff0c;当创建一个类的实例的过程很昂贵或很复杂&#xff0c;并且我们需要创建多个这样类的实例时&#xff0c;如果我们用new操作符去创建这样的类实例&#xff0c;这未免会增加创建类的复杂度和耗费更多的内存空间&#xff0c;因为这样在内存中…

数据可视化工具,免费无限制制作报表

许多企业在报表制作上投入了大量资金&#xff0c;使用各种收费软件&#xff0c;往往只能满足基本需求&#xff0c;且操作复杂&#xff0c;让人感到无比头疼。不过最近我发现之前一直在做数据大屏的山海鲸可视化&#xff0c;现在新增了报表功能&#xff0c;不仅各种功能都可以免…

创新食堂管理:采购系统源码与供应链APP开发详解

今天&#xff0c;笔者将从食堂采购系统源码与供应链管理APP开发的角度&#xff0c;探讨如何利用技术创新提升食堂管理效率&#xff0c;并为企业带来更大的价值。 一、食堂采购系统的核心功能与优势 食堂采购系统是指用于管理食堂物资采购流程的软件系统&#xff0c;其核心功能…

《学会 SpringMVC 系列 · 剖析入参处理》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…