C语言学习笔记4

结构:struct
    结构是由程序员自己设计的一种数据类型,用于描述一种事物的各项数据,由若干个不同的基础类型组成

    设计:
    struct 结构体类型名
    {
        类型名 成员名;
        ...
    };

    定义:
        struct 结构体类型名 结构体变量名;
        注意:C语言中在定义结构变量时,struct关键字不能省略
    
    初始化:
        struct 结构体类型名 结构体变量名 = {v1,v2,v3,...};
            注意:必须根据成员的设计顺序初始化
        
        struct 结构体类型名 结构体变量名 = {.成员名1=v1,.成员名2=v2,...};
            注意:不需要按照顺序,只初始化某些成员
        
        struct 结构体类型名 结构体变量名 = 同类型结构变量;
            注意:同类型的结构变量可以直接整体赋值

    访问成员:
        结构体变量名.成员名;

        结构体指针->成员名;
        注意:由于结构体变量一般字节数都较大,普通值传递效率较低,因此一般都传递结构变量的地址
            存储结构变量一般存在堆内存比较合适
    
    如何计算结构体的总字节数:
        结构成员的顺序会影响它的总字节数,因此如果能在设计结构体时合理安排成员顺序可以大大节约内存
        内存对齐:
            假定第一个成员从零地址开始,存储每个成员的地址编号必须能被该成员类型字节数整除,如果不
            能整除则填充空白字节数直到能整除为止
        内存补齐:
            结构体的总字节数,必须能被它字节数最大成员整除,如果不能则在末尾填充空白字节直到能整除为止
        在Linux系统中,计算结构体的对齐和补齐时,如果成员的类型字节数超过4,则按照4字节算
        在Windows中,会根据实际字节数算

        #pragma pack(n)设置对齐、补齐的最大字节数,在Linux只有1、2有效果
    
联合:union
    联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,其中一个成员的值改变,其他成员的值也会随之改变
    联合就是想用少量的内存对用较多的标识符,从而节约内存的目的,现在基本不再使用了
    常考的联合笔试题:
        union Data
        {
            char ch[5];
            int num;
        };
        注意:计算联合的字节数时虽然不考虑内存对齐,但是依然要考虑内存补齐
    
    如何判断系统的大小端?
        假设有十六进制数据0x01020304存储在0x0A起始的4字节内存中
        小端系统:高位数据存在高位地址
                (0A:04 0B:03 0C:02 0D:01)
        大端系统:高位数据存储在低位地址
                (0A:01 0B:02 0C:03 0D:04)

枚举:enum
    枚举类型是希望把一种类型可能出现的所有的值罗列出来,并取一个有意义的名字表示,除此之外,该类型的值如果是其它值则非法
    注意:gcc不检查是否非法,g++检查
    可以把枚举当做值受限的int类型,但是gcc编译器不检查
    注意:如果枚举成员不赋值,成员的值默认从0开始,逐渐+1,如果某个成员设置了值,后续的成员在它的基础上逐渐+1

    枚举常量与宏定义的区别:
    1、枚举常量需要占用内存,而定义宏常量不占用内存
    2、枚举常量的设计目的是为了限制实际数据输入、定义宏是为了完成代码的替换和维护
    3、枚举常量是具有类型,宏定义没有类型

文件的分类:
    文本文件:是人能看得懂的文件,存储的是字符符号的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的基础上增加读权限
    返回值:文件指针(结构指针),不需要关心它的成员,只需要知道它是操作文件的凭证

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

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


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

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

    int fclose(FILE *stream);
    功能:关闭文件 
    注意:文件读写有有缓冲区机制,想要立即写入,需要关闭文件后才能看到

文件位置指针:
    每个打开的文件都有一个指针记录这读写操作的位置,它会随着读写函数的执行而自动移动,所以以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);
    功能:获取文件位置指针的位置
    返回值:位置指针在第几字节

    char *fgets(char *s, int size, FILE *stream);
    功能:从文件中读取一行长度为size-1的字符串到s

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

    int remove(const char *pathname);
    功能:删除文件
    pathname:建议写绝对路径
    返回值:成功返回0,失败返回-1 

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

main函数参数:
    也叫命令行参数
    argc:代表了命令行提供的参数个数 ./a.out 也算一个
    argv:按顺序以字符串形式存储每个命令行参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值