程序员的每一天(Day8)

复习:

结构:

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

​ 设计:

struct 结构体名

{
	类型	成员名;
	...
}

​ 定义结构变量:

​ struct 结构体名 结构体变量;

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

​ 访问成员:

​ 结构体变量。成员名

​ 结构体指针->成员名

​ 初始化:

​ 顺序初始化:struct 结构体名 结构体变量 = {v1,v2,v3};

​ 指定方式:struct 结构体名 结构体变量 = {.成员名 = v3,.成员名 = v4};

​ 类型重定义

​ 在C语言中,Struct union enum 的关键词在设计、定义变量时不嫩省略

​ typedef struct 结构体名 结构体名;

​ typedef struct 结构体名

​ {

​ }结构体名;

​ 计算字节数:

​ 成员的顺序不同会影响结构体的总字节数,如果成员的位置能够合理安排可以大大节约内存

​ 内存对齐:

​ 假定从0地址开始,每个成员的内存起始编号必须能被它的字节数整除,如果不能被整除则填充一些空白字节

​ 内存补齐:

​ 结构的总字节数是它的最大成员字节数的整数倍,如果不是,则在末尾填充一些空白字节

注意:计算对齐、补齐时,在Linux32位系统下,超过4字节的按照4字节算

联合:

​ 所有成员共用一块内存,也就是都从同一个内存起始位开始使用。一个成员发生变化,其它所有成员的值都会随之变化,语法与结构体基本一致

​ 早期使用联合是节约内存,现在已经基本不再使用

注意:联合的成员天然是对齐的,但是要注意补齐

union	Data
{
	char str[5];
	int num;
};
总字节数:8

​ 也可以借助联合判断大小端系统;

​ 小端:高位数据存储在高位地址

​ 大端:高位数据存储在低位地址

​ 个人计算机一般都是小端系统,大型UNIX服务器、网络设备都是大端设备

枚举:

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

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的返回值
    返回值:成功写入的次数
    
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
	功能:从文件中读取数据到内存中
	ptr:读取到的数据的内存首地址
	size:一次读取多少个字节
    nmemb:读取多少次
    stream:文件指针,fopen的返回值
    返回值:成功读取的次数

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

练习2:读取信息到教师结构体中

文本方式读写文件:

​ 写入

int fprintf(FILE *stream, const char *format, ...);
	功能:以文本形式写入数据到文件中
    stream:	要写入的文件指针
    format:	占位符和提示信息
    ...:	变量列表
    返回值:成功写入的字节数
        
例:fprintf(fwp,"%d %d %lf %s",10086,100,3.14,"哈哈");

​ 读取

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:文件指针(fopen的返回值)    offset:偏移值    whence:基础位置(下列宏任选其一)        SEEK_SET	文件开头        SEEK_CUR	当前位置    	SEEK_END	文件末尾    返回值:成功返回0,失败返回-1        void rewind(FILE *stream);	功能:把文件位置指针设置到开头        long ftell(FILE *stream);	功能:获取文件位置指针的位置    返回值:第几个字节
int feof(FILE *stream);	功能:检查文件位置指针是否到达末尾    返回值:f0说明到文件末尾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、关闭文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值