C語(yǔ)言快速入門(mén)系列八之位運(yùn)算與文件

本節(jié)引言

本節(jié)講解的是C語(yǔ)言中的位運(yùn)算與文件烈菌,相信這兩章對(duì)于部分童鞋來(lái)說(shuō)是陌生的,?

因?yàn)楹芏啻髮W(xué)的老師都會(huì)選擇跳過(guò)這兩個(gè)知識(shí)點(diǎn),其實(shí)這兩個(gè)知識(shí)點(diǎn)也是非常?

重要的痰娱,比如位運(yùn)算,比如讓你算a*2菩收,怎么寫(xiě)效率(裝逼)高梨睁,如果你會(huì)位運(yùn)算?

你會(huì)?a<<1,效率可比a*2高哦娜饵,另外一個(gè)常見(jiàn)的問(wèn)題坡贺,怎么不使用中間值?

變量交換兩個(gè)變量的值?而文件操作的重要性也不用說(shuō)吧箱舞,一般期末都會(huì)讓你?

做一個(gè)xx管理系統(tǒng)之類(lèi)的東東迁客,存取文件基本是必不可少的仰楚!

本節(jié)學(xué)習(xí)路線(xiàn)圖

位運(yùn)算

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六二七,零一二,四六四 】锦爵,無(wú)論你是大牛還是小白哟忍,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)梅屉!裙內(nèi)有開(kāi)發(fā)工具筐带,很多干貨和技術(shù)資料分享!

Tips:

位運(yùn)算符并不改變自身的值寂呛,如果你想要改變自身的值官帘,可以在運(yùn)算符的后面?

加上等號(hào): a &= b; 等價(jià)于 a = a & b;

文件

1.文本文件的使用方式

讀寫(xiě)字符作用

r”只讀方式打開(kāi)一個(gè)文本文件,只允許度數(shù)據(jù),不存在則打開(kāi)失敗

w”只寫(xiě)方式打開(kāi)或建立一個(gè)文本文件,只允許寫(xiě)數(shù)據(jù)

a”追加的方式打開(kāi)一個(gè)文本文件,可在文件尾寫(xiě)數(shù)據(jù),不存在則創(chuàng)建一個(gè)

r+”讀寫(xiě)方式打開(kāi)一個(gè)文本文件,允許讀寫(xiě),不存在,打開(kāi)失敗

w+”讀寫(xiě)方式打開(kāi)或建立一個(gè)文本文件,允許讀寫(xiě)

a+”讀寫(xiě)方式打開(kāi)文本文件,在文件末尾追加數(shù)據(jù),不存在則創(chuàng)建一個(gè)

2.文件詳細(xì)學(xué)習(xí)圖

3.使用代碼示例

單個(gè)字符寫(xiě)入(fputc())/讀取(fgetc())

#include#include

int main()?

{?

? ? FILE *fp;?

? ? char str[] = "Write The Data to File!";?

? ? int index = 0;?

? ? fp = fopen("test1.txt","w");?

? ? if(fp == NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);?

? ? }?

? ? //因?yàn)槭且粋€(gè)個(gè)字符輸入的,所以要獲得長(zhǎng)度?

? ? while(index < strlen(str))?

? ? ? fputc(str[index++],fp);?

? ? fclose(fp);?

? ? return 0;?

}

#include "stdio.h"?

int main()?

{?

? ? FILE *fp;?

? ? char c;?

? ? int n = 1;?

? ? if((fp = fopen("test1.txt","r")) == NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);?

? ? }?

? ? //EOF是文件結(jié)尾的標(biāo)志,此處是判斷是否到文件尾? ?

? ? while((c = fgetc(fp)) != EOF)?

? ? {?

? ? ? ? printf("%c",c);?

? ? ? ? n++;?

? ? }?

? ? printf("\n");?

? ? fclose(fp);?

? ? return 0;?

}




運(yùn)行結(jié)果

PS:如果不寫(xiě)完整路徑的話(huà)昧谊,比如:d:\\c_code\\day 8的話(huà)刽虹,會(huì)在代碼所在的?

目錄下生成對(duì)應(yīng)的文件。

讀(fgets())寫(xiě)(fputs())一個(gè)字符串

/*

? ? fputs(字符串,fp)

? ? 作用:向fp所指的文件中,將字符串寫(xiě)入,'\0'并不寫(xiě)入!?


/* fputs(字符串,fp) 作用:向fp所指的文件中,將字符串寫(xiě)入,'\0'并不寫(xiě)入! */ #include

int main()?

{?

? ? char str[] = "通過(guò)fputs方法往文件中寫(xiě)入信息!";?

? ? FILE *fp = fopen("test2.txt","w");?

? ? if(fp == NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);?

? ? }?

? ? fputs(str,fp);?

? ? fclose(fp);?

? ? return 0;?

}


int main()?

{?

? ? FILE *fp;?

? ? char str[20];?

? ? if((fp = fopen("test2.txt","r")) == NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);?

? ? }?

? ? //這里寫(xiě)3是因?yàn)?漢字是占2個(gè)字節(jié)的?

? ? while(fgets(str,3,fp) != NULL)?

? ? printf("%s",str);?

? ? printf("\n");?

? ? fclose(fp);?

? ? return 0;?

}



運(yùn)行結(jié)果

格式化讀(fprintf)寫(xiě)(fscanf)函數(shù)

這個(gè)和前面學(xué)的scanf和printf使用方法是一樣的呢诬,不過(guò)前者們?

是針對(duì)內(nèi)存中的數(shù)據(jù)的涌哲!而后者是針對(duì)文件讀寫(xiě)的,fprintf是?

將控制臺(tái)的內(nèi)容打印到文件中尚镰,所以是寫(xiě)入阀圾,fscanf則是將?

文件的內(nèi)容輸入到控制臺(tái),所以是讀取狗唉。


#include

int main()?

{?

? ? char c[] = "Today is 2014 July ";?

? ? int day = 22;?

? ? char a = 't',b = 'h';?

? ? FILE *fp;?

? ? if((fp = fopen("test3.txt","w"))== NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);? ? ?

? ? }?

? ? fprintf(fp,"%s%d %c%c",c,day,a,b);?

? ? fclose(fp);?

? ? return 0;?

}


#include

int main()?

{?

? ? //這里很容易出問(wèn)題,所以我并不喜歡用fscanf這個(gè)函數(shù)?

? ? char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];?

? ? int day,year;?

? ? FILE *fp;?

? ? if((fp = fopen("test3.txt","r"))== NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);? ? ?

? ? }?

? ? //這個(gè)要按照讀取的文件的格式寫(xiě),我弄了N久還是不行?

? ? //就直接用6個(gè)字符串了...?

? ? fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);?

? ? printf("%s %s %s %s %s %s\n",c1,c2,c3,c4,c5,c6);?

? ? fclose(fp);?

? ? return 0;?

}


運(yùn)行結(jié)果

二進(jìn)制文件的讀寫(xiě)

數(shù)據(jù)塊方式寫(xiě)入(fwrite())與讀取(fread())

代碼示例

將學(xué)生信息存儲(chǔ)到結(jié)構(gòu)體中初烘,然后通過(guò)fwrite()函數(shù)將結(jié)構(gòu)體內(nèi)容寫(xiě)入文件中;?

在通過(guò)fread()函數(shù)讀取出來(lái)


#include

typedef struct?

{?

? ? int id;?

? ? char name[20];?

? ? int age;?

}STU;?

int main()?

{?

? ? STU stu;?

? ? FILE *fp;?

? ? char c;?

? ? //內(nèi)容是追加的!?

? ? if((fp = fopen("test4.data","ab"))== NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);? ? ?

? ? }?

? ? //錄入多個(gè)學(xué)生的信息:?

? ? while(1)?

? ? {?

? ? ? ? printf("請(qǐng)輸入學(xué)號(hào): ");scanf("%d",&stu.id);?

? ? ? ? printf("\n請(qǐng)輸入姓名: ");scanf("%s",&stu.name);?

? ? ? ? printf("\n請(qǐng)輸入年齡: ");scanf("%d",&stu.age);?

? ? ? ? //參數(shù)依次是: 數(shù)據(jù)起始地址,每次寫(xiě)入的數(shù)據(jù)塊的字節(jié)數(shù),數(shù)據(jù)塊的數(shù)目,文件指針?

? ? ? ? fwrite(&stu,sizeof(stu),1,fp);?

? ? ? ? printf("\n繼續(xù)輸入?(Y/N)\n");?

? ? ? ? getchar();?

? ? ? ? c = getchar();?

? ? ? ? if(c == 'y' || c == 'Y')continue;?

? ? ? ? else break;?

? ? }?

? ? fclose(fp);?

? ? return 0;?

}


#include

typedef struct?

{?

? ? int id;?

? ? char name[20];?

? ? int age;?

}STU;?

int main()?

{?

? ? STU stu;?

? ? FILE *fp;?

? ? if((fp = fopen("test4.data","rb"))== NULL)?

? ? {?

? ? ? ? printf("文件打開(kāi)失敗!\n");?

? ? ? ? exit(1);? ? ?

? ? }?

? ? //讀取存儲(chǔ)的學(xué)生信息?

? ? printf("輸出文件中的內(nèi)容:\n");?

? ? printf("學(xué)生學(xué)號(hào)? ? 學(xué)生姓名? ? ? ? 學(xué)生年齡\n");?

? ? //從fp指向的二進(jìn)制文件讀取數(shù)據(jù),每次讀取大小為size個(gè)字節(jié)的數(shù)據(jù)?

? ? //執(zhí)行 1 次;最后將這些數(shù)據(jù)保存到結(jié)構(gòu)體變量的地址內(nèi)存中?

? ? //返回值正常時(shí)是讀取的數(shù)據(jù)庫(kù)個(gè)數(shù)(count)的值,否則返回0(錯(cuò)誤或文件尾)?

? ? while(fread(&stu,sizeof(stu),1,fp) == 1)?

? ? {?

? ? ? ? printf("%-15d%-15s%-15d\n",stu.id,stu.name,stu.age);?

? ? }?

? ? fclose(fp);?

? ? return 0;?

}



輸出結(jié)果



字寫(xiě)入(putw(n,fp))/讀取(getw(fp))函數(shù)

getw與putw兩個(gè)函數(shù)并不是ANSI C標(biāo)準(zhǔn)定義的函數(shù),但很多C語(yǔ)言編譯系統(tǒng)都有?

提供這兩個(gè)函數(shù)肾筐,如果沒(méi)有提供也可以自己寫(xiě)哆料,這個(gè)用得不多,就不給出具體?

代碼示例了吗铐,只給出函數(shù)的用法介紹东亦。

putw(n,fp):以二進(jìn)制的形式將一個(gè)int類(lèi)型的數(shù)據(jù)寫(xiě)入到fp所指向的?

二進(jìn)制文件中! n為寫(xiě)入的整數(shù),執(zhí)行正常返回寫(xiě)入的整數(shù),否則返回EOF

getw(fp):從fp指向的二進(jìn)制文件中以二進(jìn)制的方式讀取一個(gè)字?

執(zhí)行正常返回所讀取的二進(jìn)制整數(shù),否則返回EOF

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唬渗,隨后出現(xiàn)的幾起案子典阵,更是在濱河造成了極大的恐慌,老刑警劉巖镊逝,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮啊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撑蒜,警方通過(guò)查閱死者的電腦和手機(jī)歹啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)减江,“玉大人,你說(shuō)我怎么就攤上這事捻爷”沧疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵也榄,是天一觀的道長(zhǎng)巡莹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)甜紫,這世上最難降的妖魔是什么降宅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮囚霸,結(jié)果婚禮上腰根,老公的妹妹穿的比我還像新娘。我一直安慰自己拓型,他們只是感情好额嘿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著劣挫,像睡著了一般册养。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上压固,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天球拦,我揣著相機(jī)與錄音,去河邊找鬼。 笑死坎炼,一個(gè)胖子當(dāng)著我的面吹牛愧膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播点弯,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扇调,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抢肛?” 一聲冷哼從身側(cè)響起狼钮,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捡絮,沒(méi)想到半個(gè)月后熬芜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡福稳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涎拉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片的圆。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼓拧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出越妈,到底是詐尸還是另有隱情季俩,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布梅掠,位于F島的核電站酌住,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阎抒。R本人自食惡果不足惜酪我,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望且叁。 院中可真熱鬧都哭,春花似錦、人聲如沸逞带。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掰担。三九已至汇陆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間带饱,已是汗流浹背毡代。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工阅羹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人教寂。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓捏鱼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酪耕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子导梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容