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);
}
//练习,自己用结构体数组进行二进制读写