菜鸟自学嵌入式之C语言基础No5

c基础很薄弱,仅限非计算机专业大学学的那点点基础。以后会每天更新个人的学习笔记。菜鸟的我是这样学下来滴。走过路过的,不许笑话。有缘看见的,欢迎指点。


.结构体

1.结构指针数组

struct student

{

int num;

char name[32];

int grade;

};

struct student stud[3];

struct student *stu[3];

stu[0]=&stud[0]

2.结构体嵌套

A 格式一

struct student

{

int num;

char name[32];

int grade;

};

struct class

{

struct student stu[30];   //班级中有学生结构体

char teacher[32];

};    //该结构体中包括30个学生的结构体和一个老师

定义方式

struct class c1;

赋值

c1.stu[0].num=1

strcpy(c1.stu[0].name,"chains");

初始化

struct class c1={1,"ddd",34,2,"vvvv",453,......,"dasfdsa"}

//按顺序初始化即可

B 格式二

struct class

{

struct student

{

int num;

char name[32];

int grade;

}stu[3]; //直接在class结构体中定义student结构体数组

char teacher[32];

};

效果等同格式一,但是 struct student结构体使用仅限于 struct class

3.结构体于函数之间的关系

按值传递

struct book

{

int num;

char bookname[40];

int price;

};

int sum1(struct book book1,int n) //值传递结构体作为参数

{

return book.price*n;

}

按址传递

struct book

{

int num;

char bookname[40];

int price;

};

void book(struct book *book1,int num,char name[],int price)

{

book1->num=num;

strcpy(book1->bookname,name);

book1->price=price;

}

int main()

{

book(&b1,2,"bbb",3); //地址符&不要忘了o

}

.枚举类型

方法一

enum A

{

a,  //常量前面不要加类型

b,  //注意是 , 哦亲

c//枚举常量是int

};

int main()

{

printf("a=%d",a); //输出结果为0

}

方法二

enum A

{

a,  //常量前面不要加类型

b,  //注意是 , 哦亲

c//枚举常量不赋值时默认从0依次递增

};

enum A m;

int main()

{

m=a;

printf("m=%d",m); //输出结果为0

}

赋值

enum A

{

a,   //  =0

b=5, //  =5

c    //  =6

};

.联合类型 (又称共用体)

1.定义方式

union u_tag

{

int ival;

float fval;

double dval;

char cval;

char *pval;

};    //结构类似于结构体但是用法完全不同,别用混了

union u_tag u;

2.内存分配原则

按照最大变量为准则分配,其他变量共享该内存 //sizeof(union u_tag)=8   sizeof(struct u_tag)=21

[&u.ival=&u.fval]

对后面变量赋值会覆盖前一变量的值

3.应用

多用于对未知数据类型选类型

重要应用:结构体中嵌套联合

struct student

{

int num;

char name[30];

union {               //联合在结构体内部可以忽略类型名称,在结构体外必须 union 后加名称

int ival;

float fval;

char cval;

}u;

}stu[3];

stu[0].u.fval;//赋值方式

.文件操作(标准I/O

1.参数

操作对象--文本文件(  .txt )

r   只读模式

w   文件不存在,创建文件,写入文件并覆盖

a    文件不存在,产生新文件,文件存在,在原文件尾部增加数据

r+   读取或修改文件

w+   文件不存在,产生新文件,读取或写入文件并覆盖

a+   a相同

操作对象--二进制

rb   只读模式

wb   文件不存在,创建文件,有同名原文件丢掉,产生新文件

ab    文件不存在,产生新文件,文件存在,在原文件尾部增加数据

r+b   读取或修改文件

w+b   文件不存在,产生新文件,读取或写入文件,存在同名文件,原文件丢弃,产生新文件

a+b   a相同

2. 函数  

#include<stdio.h>

A 定义文件指针

FILE *P;

B 打开/创建文件

P=fopen("stu.txt","w") //p指针操作文件

C 异常处理

if((fopen("stu.txt","w"))==NULL)  //如果打开失败

{printf("文件打开失败");}

else

{printf("文件打开成功");}

D 关闭文件

fclose(p);

E 处理文件

fprintf(文件名,"   内容  ",参数); //把数据打印到文件中,其他用法同printf();

fscanf(文件名,"内容\t内容\n", 参数);  //把数据从文件中读取出来

/*

作业:

学生结构体

根据客户要求定义结构体大小

将数组中学生存入文件

读取文件存入数组

新增学生追加到文件

查找学生(根据学号姓名)并列出所有信息

删除学生--数组及文件中均要删除

修改学生--(根据学号)

*/

3.二进制文件操作

FILE *p;

p=fopen("a.bin","wb");

if(p==NULL)  //如果打开失败

{printf("文件打开失败");}

else

{printf("文件打开成功");}

int a[5]={1,2,3,4,5}

//写文件

fwrite(a,sizeof(int),5,p);  //内存位置(数组名),大小单位,个数,文件名

实质:把内存数据直接写入文件

//读文件

fread(&x,sizeof(int),1,p);  //写入参数位置,大小,个数,文件

.二进制文件:优点可以对数据整体读写操作

1.二进制文件保存结构体

typedef struct l//typedef 类型重定义

{

char name[20];

char tel[20];

char addr[20]

}list;  //类型名通常用大写,容易区分

// 传参写入二进制文件

void add_data(char *iname,char *itel,char *iaddr, FILE *p)  //在不需要改变的变量前加const

{

list l1;  //list型结构体定义 l1

strcpy(l1.name,iname);

strcpy(l1.tel,itel);

strcpy(l1.addr,iaddr);

fwrite(&l1,sizeof(l1),1,p);

}

// 读操作

typedef struct l//typedef   struct 后面类型 “l”可以省略

{

char name[20];

char tel[20];

char addr[20]

}list;

int main()

{

FILE *p;

list l1;

int i;

p=fopen("aaa.bin","rb");  //fopen 后及时加fclose 以免遗忘

fread(&l1,sizeof(l1),1,p);

}

//练习,自己用结构体数组进行二进制读写




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章