标准C语言基础知识14(终篇)

复习:
结构:
    结构是一种由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个基础的数据类型组成
    设计:
    struct 结构体名
    {
        类型 成员名;
        ...
    };

    定义结构变量:
    struct 结构体名 结构体变量
    注意:也可以在设计结构体时直接定义结构体变量

    访问成员:
        结构体变量.成员名
        结构体指针->成员名
    
    初始化:
        顺序:struct 结构体名 结构体变量 = {v1,v2,v3...};
        指定:struct 结构体名 结构体变量 = {.成员名=v3,.成员名=v1};

    类型重定义:
        在C语言中 struct union enum 的关键词在设计、定义变量时不能省略
        typedef struct 结构体名 结构体名;
        typedef struct 结构体名 
        {

        }结构体名;
    
    计算字节数:
        成员的顺序不同会影响结构体的总字节数,如果成员的位置能够合理安排可以大大节约内存
            内存对齐:
                假定从0地址开始,每个成员使用的内存起始编号必须能被它的字节数整除,如果不能整除则填充一些空白字节
            内存补齐:
                结构的总字节数必须是它的最大成员字节数的整数倍,如果不是,则在末尾填充一些空白字节
            注意:计算对齐、补齐时,在Linux32位系统下,超过4字节按照4字节算


联合:union
    所有成员共用一块内存,也就是都从同一个内存起始位开始使用,一个成员发生变化,其他所有成员的值都会随之变化,语法与结构体一致。
    早期使用联合是为节约内存,现在已经基本不再使用
    注意:联合的成员天然是对齐的,但是要注意补齐
        union Date
        {
            char str[5];
            int num;
        }
        总字节数:8
    也可以借助联合判断大小端系统:
        小端:高位数据存储在高位地址
        大端:高位数据存储在低位地址
        个人计算机一般都是小端系统,大型UINIX服务器、网络服务器都是大型系统

枚举:
    把一个整型变量可能出现的所有值罗列出来,除此之外的值如果赋值给枚举变量就是非法的(愿望)

    enum 枚举名{枚举常量1=常量值,枚举常量2=常量值,...}
    enum 枚举名 枚举变量;

    枚举变量相当于值受限(愿望)的int类型变量

文件的分类:
    文本文件:  存储的是ASCII的二进制   '2' '5' '5' (人能看得懂)
    二进制文件:存储的数据的补码 255    1111 1111

文件IO:
    FILE *fopen(const char *path, const char *mode);
    功能:打开或创建文件
    path:文件的路径
    mode:打开模式
        r       以只读权限打开文件,如果文件不存在则打开失败
        r+      在r的基础上增加写权限
        w       以只写权限打开文件,如果文件不存在则新建,如果文件存在则清空
        w+      在w的基础上增加读权限
        a       以只写权限打开文件,如果文件不存在则新建,如果文件存在则不清空,新写入的数据在文件末尾
        a+      在a的基础上增加读权限

        以上方式以文本形式操作文件,在它们基础上加b表示以二进制方式操作文件

    返回值:结构指针,也称为文件指针,不需要关心它的成员,只需要知道它是操作文件的凭证,如果值是NULL表示文件操作失败

二进制方式读写文件:
     
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    功能:把内存中的数据写入到文件中
    ptr:内存首地址
    size:一次写入多少个字节
    nmemb:写入多少次
    stream:文件指针,fopen的返回值
    返回值:成功写入的次数

    练习1:定义一个教师结构体变量并初始化,以二进制形式写入文件中


    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:从文件中读取数据到内存中
    ptr:存储从文件中读取的数据内存首地址
    size:一次读取的字节数
    nmemb:读取多少次
    stream:文件指针,fopen的返回值
    返回值:成功读取到的次数

    练习2:从文件中读取数据到一个教师结构体变量中,并显示

文本方式读写文件:
    int fprintf(FILE *stream, const char *format, ...);
    功能:以文本形式写入数据到文件中
    stream:要写入的文件
    format:占位符和提示信息
    ...:变量列表
    返回值:成功写入的字节数

    int fscanf(FILE *stream, const char *format, ...);
    功能:从文件中读取数据到变量中
    stream:要读取的文件指针
    format:占位符
    ...:变量地址列表
    返回值:成功读取到的变量个数

    int fclose(FILE *fp);
    功能:关闭文件

    练习3:定义一个教师结构体变量并初始化,以文本形式写入到文件中。
    练习4:从文件中以文本形式读取数据到教师结构体中并显示。

文件的随机读写:
    文件位置指针:
        每个打开的文件都有一个指针记录着操作的位置,它会随着读写函数的执行而移动,以r,r+、w、w+模式打开文件位置指针在开头,以a、a+打开文件位置指针在文件的末尾

        如果想要随机读写文件的任意位置的数据,只需要手动设置文件的位置指针即可
        int fseek(FILE *stream, long offset, int whence);
        功能:设置文件的位置指针
        stream:要设置的文件
        offset:偏移值(字节数)
        whence:基础位置
            SEEK_SET    文件开头
            SEEK_CUR    当前位置
            SEEK_END    文件末尾
        返回值:成功返回0,失败返回-1

        void rewind(FILE *stream);
        功能:把文件位置指针设置到开头

        long ftell(FILE *stream);
        功能:获取文件位置指针的位置
        返回值:第几个字节

        int feof(FILE *stream);
        功能:检查文件的位置指针是否到达末尾
        返回值:0 说明到达文件末尾

        char *fgets(char *s, int size, FILE *stream);
        功能:从文件中读取一行字符串

        int fputs(const char *s, FILE *stream);
        功能:写入一个字符串到文件中,自动在末尾添加\n
        返回值:成功写入的字符个数

        int remove(const char *pathname)
        功能:删除文件
        返回值:成功返回0,失败返回-1

        int rename(const char *oldpath, const char *newpath);
        功能:重命名文件
        返回值:成功返回0,失败返回-1

main函数的参数:
    是为了获取命令行附加的参数
    argc 代表参数的个数
    argv 每个字符串参数的首地址
    注意:./a.out 一定是第一个参数

    练习5:实现cp命令的功能
    cp src dest
    1、以r打开src文件,以w创建dest文件
    2、边读边写、直到文件读到末尾结束
    3、关闭文件
    ./CP src dest


        


 

你可能感兴趣的:(标准C语言基础知识14(终篇))