本節(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)的東東迁客,存取文件基本是必不可少的仰楚!
小編推薦一個(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;
讀寫(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è)
單個(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