菜鳥自學嵌入式之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);

}

//練習,自己用結構體數組進行二進制讀寫




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