华清远见嵌入式培训_第六周回顾与反思

目录

前言

周二

IO简介和标准IO

一、IO简介

1.1 什么是IO

1.2 IO的分类

1.3 什么是系统调用和和库函数

1.4 什么是IO接口

二、标准IO

2.1 fopen/fclose函数

2.1 strerror函数

2.3 perror函数

2.4 fputc/fgetc函数

2.5 fgets/fputs函数

三、缓冲区问题

3.1 缓冲区的大小及类型

3.2 行缓存的刷新机制

3.3 全缓存的刷新机制

四、课后作业

周三

标准IO及文件IO

一、标准IO

1.1 fread/fwrite函数

1.2 sprintf/snprintf/fprintf函数

1.3 获取系统函数

1.4 fseek/ftell/rewind光标操作函数

1.5使用标准IO对bmp格式图片打马赛克

二、文件IO

2.1 open/close函数

周四

文件IO、文件属性操作和目录操作

一、文件IO

1.1read/write函数

二、获取文件属性的函数

2.1 stat函数

2.2 getpwuid/getgrid函数

三、目录操作

3.1 打开目录opendir

3.2 读目录readdir

3.3关闭目录closedir

3.4读取任意文件夹下的所有文件实例

课后作业

周五

库、多进程

一、Linux中的库

1.1 什么是库文件

1.2 库文件的分类

1.3 静态库

1.4动态库

二、多进程

2.1 什么是多进程

2.2 进程和程序的区别

2.3 进程的组成

2.4 什么是PID?

2.5 特殊PID的进程

2.6 进程的种类

2.7 进程相关的命令

2.8 进程的状态

2.9 特殊状态的进程

2.10 进程的创建

课后作业


前言

        从这一周开始学习的课程是IO进程,为时八天;本周的周一是数据结构的考试,考试的总结写在了上一周的末尾;从周二到周五这四天的时间里,主要学习了:文件IO、标准IO、库和多进程。

        老师说从IO进程开始,课程就从基础阶段拔高到应用层面了,经过这四天的学习下来,主要感觉就是:内容多、代码量大、要熟悉和记忆的内容多、易混淆的知识点多。比较重要的内容还是标准IO和文件IO里的海量的函数接口,因此,本次的反思将针对这几方面,进行整理归纳,难点分析和易混淆点辨析。

        同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见!

周二

IO简介和标准IO

一、IO简介

1.1 什么是IO

        IO(input&output)是用户空间和内核空间通过API进行的交互。

1.2 IO的分类

        IO分为:标准IO和文件IO

        标准IO:库函数

        文件IO:系统调用

1.3 什么是系统调用和和库函数

        系统调用:系统调用是用户空间进入内核空间的一次过程。

                优点:操作系统不同,系统调用的函数接口也不同,因此系统调用的移植性比较差。

                缺点:系统调用没有缓冲区,所以效率比较低。

        库函数:库函数 = 系统调用 + 缓冲区

                优点:库函数要比系统调用的效率高。

                缺点:库函数的接口比较统一,移植性比较强。

        区别辨析:系统调用对内核的访问是即时的,库函数的缓冲区需要刷新才能访问内核。

1.4 什么是IO接口

        IO接口就是函数调用,系统已经封装好,使用时直接调用。

        例如:

                标准IO:fopen fread fwrite fputc fgetc fputs fgets fclose printf scanf...

                文件IO:open read write close...

二、标准IO

        标准IO:库函数 = 系统调用 + 缓冲区

        标准IO:fopen fread fwrite fputc fgetc fputs fgets fclose printf scanf...

        FILE结构体:

                FILE本身是一个结构体,在调用fopen的时候产生一个结构体指针,这个FILE结构体,就代表打开文件的所有的信息(例如缓冲区的大小,光标的位置等信息),并且以后在读写文件的时候通过FILE指针完成。

                在一个正在执行的程序中,默认已经有了三个FILE指针:stdin、stdout、stderr

                它们分别代表的是标准输入,标准输出,标准出错。

typedef struct _IO_FILE FILE;

struct _IO_FILE {
  char* _IO_buf_base; //缓冲区的起始地址
  char* _IO_buf_end; //缓冲区的结束地址
  ...
}

2.1 fopen/fclose函数

#include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);
功能:使用标准IO接口打开文件
参数:
    @pathname:想要打开文件的路径及名字  "/home/linux/1.c"
    @mode    :打开文件的方式  "r" "r+" "w" "w+" "a" "a+"
       r     :以只读的方式打开文件,将光标定位到文件的开头
       r+    :以读写的方式打开文件,将光标定位到文件的开头
       w     :以只写的方式打开文件,如果文件存在就清空文件,如果文件不存在就创建文件
       w+    :以读写的方式打开文件,如果文件存在就清空文件,如果文件不存在就创建文件
       a     :以追加的方式打开文件,如果文件不存在就创建文件,如果文件存在光标定位到结尾进行写
       a+    :以读和追加的方式打开文件,如果文件不存在就创建文件,如果进行读从开头读,如果写
              在结尾写。
返回值:成功返回FILE指针,失败返回NULL,置位错误码

int fclose(FILE *stream);
功能:关闭文件
参数:
    @stream:文件指针
返回值:成功返回0,失败返回EOF(-1),置位错误码

 实例:

#include <stdio.h>

int main(int argc,const char * argv[])
{
    FILE *fp;
    if((fp = fopen("./hello.txt","w")) == NULL){
        printf("fopen file error\n");
        return -1;
    }
    
    //有一个fopen就要对应一个fclose
    if(fclose(fp)){
        printf("fclose file error\n");
        return -1;
    }
    return 0;
}

2.1 strerror函数

#include <string.h>

char *strerror(int errnum);
功能:将错误码转换为错误信息的字符串
参数:
    @errnum:错误码
返回值:错误信息的字符串

 实例:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc,const char * argv[])
{
    FILE *fp;
    if((fp = fopen("./hello.txt","r")) == NULL){
        printf("fopen file error\n");
        printf("errno = %d,%s\n",errno,strerror(errno));
        return -1;
    }
    return 0;
}

2.3 perror函数

#include <stdio.h>

void perror(const char *s);
功能:将错误信息打印到终端上
参数:
    @s:用户的附加信息
返回值:无

实例:

        注意perror打印时会在结尾部冒号。

#include <stdio.h>

int main(int argc,const char * argv[])
{
    FILE *fp;
    if((fp = fopen("./hello.txt","r")) == NULL){
        perror("fopen file error");
        return -1;
    }
    return 0;
}

2.4 fputc/fgetc函数

        put是往文件中,get是从文件中

#include <stdio.h>

int fputc(int c, FILE *stream);
功能:向文件中写入字符
参数:
    @c:字符的ascii
    @stream:文件指针
返回值:成功返回字符ascii值,失败返回EOF(-1)

int fgetc(FILE *stream);
功能:从文件中读取字符
参数:
    @stream:文件指针
返回值:成功读取到的字符的ascii,读取到文件结尾或者出错,返回EOF(-1)

fputc实例

#include <stdio.h>

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

    //以只写的方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件
    if ((fp = fopen("./hello.txt", "w")) == NULL) {
        perror("fopen file error");
        return -1;
    }
    
    fputc('h', fp); //将h字符写入到文件中,同时光标会向后移动一个字符的位置
    fputc('e', fp); //将e字符写入到文件中,同时光标会向后移动一个字符的位置
    fputc('l', fp);
    fputc('l', fp);
    fputc('o', fp);

    fclose(fp);
    
    return 0;
}
#include <stdio.h>

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

    //以只写的方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件
    if ((fp = fopen("./hello.txt", "w")) == NULL) {
        perr
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值