接續(xù)上篇C語(yǔ)言基礎(chǔ)及指針⑧文件IO
在上篇中 剩晴, 我們初步了解了C語(yǔ)言的IO操作 , 編寫(xiě)IO操作的大致流程:
文件IO編寫(xiě)步驟:
1.使用fopen
函數(shù) 锁荔, 得到文件指針
2.指定fopen
的操作模式r
,w
(指定輸入輸出流)
3.創(chuàng)建緩沖區(qū) 瞎领, 緩存讀寫(xiě)數(shù)據(jù)(將流數(shù)據(jù)讀入到內(nèi)存或?qū)懭氲酱疟P(pán))
3.關(guān)閉流 (關(guān)閉文件流)
接著介紹了文件的加密解密 , 文件的存儲(chǔ)都是以二進(jìn)制保存在磁盤(pán)上的 勇劣, 所以我們可以通過(guò)二進(jìn)制運(yùn)算來(lái)進(jìn)行文件的加密解密操作 靖避。在C語(yǔ)言的IO函數(shù)中 潭枣, 沒(méi)有直接獲取文件大小的函數(shù) , 所以我們需要自己通過(guò)文件指針來(lái)獲取文件的大谢媚蟆:
/*獲取文件大小*/
void getFileSize() {
char* path = "E:\\android_pdf\\研磨設(shè)計(jì)模式.pdf";
// 打開(kāi)文件
FILE* fp = fopen(path, "r");
if (fp == NULL) {
printf("打開(kāi)文件失敗\n");
return;
}
// 重新定位文件指針 , SEEK_END文件末尾盆犁,0是文件指針的偏移量
fseek(fp, 0l, SEEK_END);
// 返回當(dāng)前的文件指針,相對(duì)于文件開(kāi)頭的位移量
long fileSize = ftell(fp);
printf("文件大写劬拧:%ld M\n", fileSize / 1024 / 1024);
}
在jni.h中 谐岁, 我們可以看到這樣一段代碼:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
這樣C語(yǔ)言中的聯(lián)合體 , 那么什么是聯(lián)合體呢 瓮下?
聯(lián)合體:不同類(lèi)型的變量共用一段內(nèi)存(相互覆蓋) 翰铡, 始終只有一個(gè)成員存在 , 最后賦值的那個(gè) 讽坏, 有利于節(jié)省內(nèi)存锭魔。
聯(lián)合體大小:成員中最大的成員所占的字節(jié)數(shù)
聯(lián)合體 路呜, 將不同的類(lèi)型聯(lián)合起來(lái) 迷捧, 組成一個(gè)新的聚合類(lèi)型 , 這個(gè)類(lèi)型可以是聯(lián)合體中的任意類(lèi)型 胀葱。
/*聯(lián)合體*/
/*
不同類(lèi)型的變量共用一段內(nèi)存(相互覆蓋) 漠秋, 始終只有一個(gè)成員存在 , 最后賦值的那個(gè) 抵屿, 有利于節(jié)省內(nèi)存
聯(lián)合體大星旖酢:成員中最大的成員所占的字節(jié)數(shù)
*/
union mValue
{
int i;
short s;
long l;
float f;
};
/*聯(lián)合體示例*/
void useUnion() {
union mValue m;
m.f = 23.4f;
m.i = 100; // 最后一次賦值有效
printf("聯(lián)合體:\n%f - %d\n", m.f, m.i);
}
在java中 , 當(dāng)我們需要一個(gè)類(lèi)列舉幾個(gè)狀態(tài)時(shí) 轧葛, 因?yàn)闋顟B(tài)是固定的 搂抒, 所以我們通常的做法是使用枚舉 , 將狀態(tài)列舉出來(lái) 尿扯, 在C語(yǔ)言也有枚舉這個(gè)類(lèi)型:
/*
枚舉(列舉所有的情況)
限定值求晶,保證取值的安全性
*/
enum NetStatus {
NET_SUCEESS,
NET_ERROR,
NOT_NET,
NET_FAILURE
};
下面我們來(lái)看一個(gè)示例 , 來(lái)大致了解一下枚舉的使用場(chǎng)景:
/*枚舉*/
/*
枚舉(列舉所有的情況)
限定值衷笋,保證取值的安全性
*/
enum NetStatus {
NET_SUCEESS,
NET_ERROR,
NOT_NET,
NET_FAILURE
};
/*模擬網(wǎng)絡(luò)請(qǐng)求*/
void requestHttp(char* url, void(*callBack)(enum NetStatus status,char* res)) {
printf("請(qǐng)求地址:%s\n", url);
printf("請(qǐng)求網(wǎng)絡(luò)....\n");
Sleep(2000);
enum NetStatus status = NET_SUCEESS;
char* res = "如果 愛(ài)情是一場(chǎng)花火 ,一閃即逝的花火,我也要去追求\n";
callBack(status, res);
}
/*網(wǎng)絡(luò)回調(diào)函數(shù)*/
void callBackHttp(enum NetStatus status, char* res) {
switch (status)
{
case NET_SUCEESS:
printf("網(wǎng)絡(luò)數(shù)據(jù):\n%s", res);
break;
case NET_ERROR:
printf("請(qǐng)求網(wǎng)絡(luò)錯(cuò)誤\n");
break;
case NOT_NET:
printf("沒(méi)有網(wǎng)絡(luò)\n");
break;
case NET_FAILURE:
printf("請(qǐng)求網(wǎng)絡(luò)失敗\n");
break;
default:
printf("未知錯(cuò)誤\n");
break;
}
}
/*枚舉示例*/
void useEnum() {
enum NetStatus status = NET_FAILURE;
printf("枚舉中元素的值:%d\n", status);
char* url = "http://www.zhuyongit.com";
requestHttp(url, callBackHttp);
}
我們模擬了網(wǎng)絡(luò)請(qǐng)求的幾種情況 芳杏, 成功 , 失敗 辟宗, 錯(cuò)誤等等 爵赵, 通過(guò)枚舉將這些情況列舉出來(lái) ,然后通過(guò)網(wǎng)絡(luò)回調(diào)函數(shù)傳遞到網(wǎng)絡(luò)處理函數(shù) 慢蜓, 通過(guò)switch
分支語(yǔ)句來(lái)進(jìn)行不同網(wǎng)絡(luò)狀態(tài)的判斷 亚再。
在jni.h頭文件中 , 我們也可以見(jiàn)到類(lèi)似的應(yīng)用:
typedef enum jobjectRefType {
JNIInvalidRefType = 0,
JNILocalRefType = 1,
JNIGlobalRefType = 2,
JNIWeakGlobalRefType = 3
} jobjectRefType;
使用枚舉來(lái)標(biāo)識(shí)對(duì)象引用的類(lèi)型 晨抡, 本地引用氛悬,全局引用则剃,弱引用,等等 如捅,因?yàn)槲覀冊(cè)谑褂胘ni調(diào)取java對(duì)象的時(shí)候 棍现, java虛擬機(jī)并沒(méi)有將引用數(shù)加1 , 所以我們需要用過(guò)加強(qiáng)引用類(lèi)型 镜遣, 來(lái)保證jni引用的java對(duì)象己肮,不被虛擬機(jī)回收掉 。
在IT的路上 悲关, 山路崎嶇 谎僻, 山崖陡峭 , 自學(xué)如在荊棘滿(mǎn)布的叢林中 寓辱, 披荊斬棘 艘绍, 在渾濁的河流中 , 摸著石頭過(guò)河 秫筏。何以保證我們走的是正確的方向 诱鞠, 長(zhǎng)沙動(dòng)腦學(xué)院 , 老司機(jī)眾多 这敬, 功力深厚 航夺, 開(kāi)車(chē)穩(wěn)當(dāng) , 都是互聯(lián)網(wǎng)老兵 崔涂, 他們是IT路上的探頭燈 阳掐, 幫你指明方向 , 帶你超神 冷蚂, 他們的宗旨是:做一家受人尊敬的企業(yè)锚烦,做一位受人尊敬的老師【動(dòng)腦學(xué)院】。 --- 特約贊助
Android程序員學(xué)C系列:
C語(yǔ)言基礎(chǔ)及指針①
C語(yǔ)言基礎(chǔ)及指針②之指針內(nèi)存分析
C語(yǔ)言基礎(chǔ)及指針③函數(shù)與二級(jí)指針
C語(yǔ)言基礎(chǔ)及指針④函數(shù)指針
C語(yǔ)言基礎(chǔ)及指針⑤動(dòng)態(tài)內(nèi)存分配
C語(yǔ)言基礎(chǔ)及指針⑥字符操作
C語(yǔ)言基礎(chǔ)及指針⑦結(jié)構(gòu)體與指針
C語(yǔ)言基礎(chǔ)及指針⑧文件IO
C語(yǔ)言基礎(chǔ)及指針⑨聯(lián)合體與枚舉
C語(yǔ)言基礎(chǔ)及指針⑩預(yù)編譯及jni.h分析