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);
}
//練習,自己用結構體數組進行二進制讀寫