? ? 上一篇總結(jié)了文件I/O的系統(tǒng)調(diào)用,今天來(lái)總結(jié)下標(biāo)準(zhǔn)I/O庫(kù)在工作幾年經(jīng)常使用的函數(shù)。
目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、膠州網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
????標(biāo)準(zhǔn)I/O庫(kù)(#include<stdio.h>)實(shí)際就是封裝了系統(tǒng)調(diào)用;這樣做的主要目的是減少對(duì)系統(tǒng)調(diào)用的調(diào)用,從而提高效率。
1、流和FILE對(duì)象
文件I/O操作的的文件描述符,而標(biāo)準(zhǔn)I/O庫(kù)操作的是流即就是FILE對(duì)象。當(dāng)打開一個(gè)流時(shí),返回一個(gè)FILE對(duì)象。
2、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤
對(duì)應(yīng)文件I/O的文件描述符文件為:0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO)
對(duì)應(yīng)標(biāo)準(zhǔn)I/O庫(kù)的流為:stdin、stdout、stderr;
3、標(biāo)準(zhǔn)I/O提供三種緩沖(減少對(duì)系統(tǒng)調(diào)用的調(diào)用)
????int?setbuf(FILE?*stream,char?*buf?);/*buf?=null?關(guān)閉緩沖,buf長(zhǎng)度=BUFSIZE設(shè)置緩沖區(qū)*/ ????int?setvbuf(FILE?*stream,char?*buf,int?mode,size_t?size);/*mode?:_IOFBF?全緩沖;_IOLBF行緩沖;_IONBF不帶緩沖。長(zhǎng)度為size?的buf,如果buf=NULL,則為系統(tǒng)默認(rèn)大小。*/ ????int?fflush(FILE*fp);/*強(qiáng)制刷新一個(gè)流,用于刷新緩沖區(qū)*/
1)?全緩沖:當(dāng)不涉及到交互式設(shè)備時(shí),則為全緩沖。
2)?行緩沖:終端設(shè)備一般是行緩沖。有時(shí)不需要緩沖區(qū),比如之前例子里,需要實(shí)時(shí)打印printf,所以要講其設(shè)置成不帶緩沖:?
??????setvbuf(stdout,NULL,_IONBF,0)
3)?不帶緩沖:標(biāo)準(zhǔn)出錯(cuò)就是不帶緩沖,當(dāng)出現(xiàn)錯(cuò)誤的時(shí)候會(huì)立即輸出。
4、?打開和關(guān)閉流
????FILE?*fopen(const?char?*path,const?char?*mode); ????FILE?*fdopen(int?fd,const?char?*mode); ????FILE?*freopen(const?char?*path,const?char?*mode,FILE?*stream);
三個(gè)函數(shù)都是打開一個(gè)流,fopen:打開一個(gè)指定的流;fdopen:流和一個(gè)文件描述符結(jié)合;freopen:在一個(gè)指定的流上打開一個(gè)指定的文件,已打開則關(guān)閉、已定向則消除。
mode:r讀、r+讀寫、w寫、w+讀寫、a在文件尾部寫、a+在文件尾部讀和寫。
int fclose(FILE *stream);/*關(guān)閉一個(gè)流*/
5、讀和寫流
讀和寫流分為三種:每次一個(gè)字符的I/O;每次一行的I/O;直接I/O(二進(jìn)制I/O)按字節(jié)操作。
1)?字符I/O
讀函數(shù):
????int?getc(FILE?*fp); ????int?fgetc(FILE?*fp); ????int?getchar(void);/*getc(stdin)*/
因?yàn)橐袛喑鲥e(cuò)或者是不是到了流的末端(EOF = -1),所以返回值都是整型。
用函數(shù):int ferror(FILE *fP)/*未出錯(cuò)返回0*//int feof(FILE *fp)/*返回0表示文件未結(jié)束*/
寫函數(shù):
????int?putc(int?c,FILE?*fp); ????int?fputc(int?c,FILE?*fp); ????int?putchar(int?c);/*putc(c,stdout)*/
2)?行I/O
讀函數(shù):
????char?*fgets(char?*buf,int?n,FILE?*fp);/*讀到下一個(gè)換行符如果buf夠大,如果buf沒(méi)有一行大,返回一個(gè)不完整的行,下次繼續(xù)讀改行*/ ????char?*gets(char?*buf);/*從stdin讀*/
?????? 寫函數(shù):
????char?fputs(char?*buf,FILE?*fp); ????char?puts(char?*buf);/*寫到stdout*/
3)?二進(jìn)制I/O
????size_t?fread(void?*ptr,size_t?size,size_t?nmemb,FILE?*stream?); ????size_t?fwite(const?void*ptr,size_t?size,size_t?nmemb,FILE?*stream);
/*size指定ptr長(zhǎng)度,nmemb指定讀或者寫幾個(gè)size長(zhǎng)度的ptr*/
工作中經(jīng)常從flash讀出設(shè)備的鏡像:
/*read?boot?&?image*/ cs_status?cs_build_image() { ????cs_uint32?offset?=?0; ????int?ret?=?0; ????FILE?*??bootfp?=?NULL; ????FILE?*??imgfp?=?NULL; ????ULONG???lByte?=?0;??????????????????/*讀取文件時(shí)的單元長(zhǎng)度*/ ????UCHAR???ucBuffer[1024]?=?{0};/*用來(lái)存儲(chǔ)讀出來(lái)鏡像單元*/ ????ULONG???ulImageLen?=?0;????????????????????/*記錄文件的總體長(zhǎng)度*/ ????UCHAR???uc8124imgName[48]?=?{0};??????????/*local?file?name*/ ????UCHAR???uc8124stage2ImgName[48]?=?{0};??????????/*local?file?name*/ ????UCHAR???head?=?64; ????sprintf(?uc8124stage2ImgName,?"/ram0/%s",?"stage2"?); ????if(?NULL?==?(?bootfp?=?fopen(?uc8124stage2ImgName,?"wb+"?)?)?) ????{ ????????printf(?"open?to??cs8124_img?file!\r\n"?); ????????return?ERROR; ????} ????ret?=?GenHwSysFlashload8124Stage2Image(bootfp); ????if(?OK?!=?ret?) ????{ ????????printf(?"read?8124Stage2Image?from?flash?error!?\r\n"?); ????????return?ERROR; ????} ????g_uc8124stage2Image?=?(cs_uint8*)malloc(sizeof(cs_uint8)?*?TEST_MAX_OLT_LOADER_IMAGE?); ????if(g_uc8124stage2Image?==?NULL){ ????????printf("malloc?g_uc8124stage2Image?error\n"); ????} ????memset(g_uc8124stage2Image,?0,?TEST_MAX_OLT_LOADER_IMAGE); ????fseek(?bootfp,?0,?SEEK_SET?); ????while(?0?<?(?lByte?=?fread(?ucBuffer,?1,?1024,?bootfp?)?)?) ????{ ulImageLen?+=?(lByte-head); /*寫在本地文件操作*/ ????????memcpy(?g_uc8124stage2Image?+?offset,?ucBuffer+head?,?lByte-head?); offset?+=?lByte-head; memset(?ucBuffer,?0?,?sizeof(?ucBuffer?)?); head?=?0; ????} ????printf("[%s%d?]?g_uc8124stage2Image:%d\n",__FILE__,__LINE__,ulImageLen); ????g_ucStage2ImageLen?=?ulImageLen; ????if(TEST_MAX_OLT_LOADER_IMAGE?<?ulImageLen){ ????????return?ERROR; ????} ????fclose(?bootfp); ????ret?=?remove(?uc8124stage2ImgName?); ????if(?OK?!=?ret??) ????{ ????????printf(?"?8124stage2Image?error!?\r\n"?); ????????return?ERROR; ????} /*get?cs8124?image(firmware)*/ ????sprintf(?uc8124imgName,?"/ram0/%s",?"imgenew"?); ????if(?NULL?==?(?imgfp?=?fopen(?uc8124imgName,?"wb+"?)?)?) ????{ printf(?"Fail?to?create?cs8124_img?file!\r\n"?); return?ERROR; ????} ????ret?=?GenHwSysFlashload8124Image(imgfp); ????if(?OK?!=?ret?) ????{ printf(?"read?8124Image?from?flash?error!?\r\n"?); return?ERROR; ????} ????g_ucpOltImage?=?(cs_uint8*)malloc(sizeof(cs_uint8)?*?TEST_MAX_OLT_IMAGE?); ????if(g_ucpOltImage?==?NULL){ ????printf("malloc?g_ucpOltImage?error\n"); ????} ????memset(g_ucpOltImage,?0,?TEST_MAX_OLT_IMAGE); ????fseek(?imgfp,?0,?SEEK_SET?); ????lByte?=?0; ????ulImageLen?=?0; ????offset?=?0; ????head?=?64; ????memset(?ucBuffer,?0?,?sizeof(?ucBuffer?)?); ????while(?0?<?(?lByte?=?fread(?ucBuffer,?1,?1024,?imgfp?)?)?) ????{ ulImageLen?+=?(lByte-head); /*寫在本地文件操作*/ memcpy(?g_ucpOltImage?+?offset,?ucBuffer+head?,?lByte-head?); offset?+=?lByte-head; memset(?ucBuffer,?0?,?sizeof(?ucBuffer?)?); head?=?0; ????} ????printf("[%s%d?]?g_ucpOltImage?len:%d\n",__FILE__,__LINE__,ulImageLen); ????g_ucOltImageLen?=?ulImageLen; ????if(TEST_MAX_OLT_IMAGE?<?ulImageLen){ ????? return?ERROR; ????} ????fclose(?imgfp); ????ret?=?remove(?uc8124imgName?); ????if(?OK?!=?ret?) ????{ printf(?"?uc8124imgName?error!?\r\n"?); return?ERROR; ????} ? }
6、?定位流函數(shù)
int?fseek(FILE?*fp,long?offset,int?whence);/*和文件I/Olseek函數(shù)類似,whence相同:SEEK_SET從文件起始開始,SEEK_CUR從文件當(dāng)前開始,SEEK_END從文件末端開始*/
7、??格式化I/O
格式化輸出函數(shù):
????int?printf(const?char?*format,….); ????int?fprintf(FILE?*fp,const?char?*format,….); ????int?sprintf(char?*buf,const?char?*format,…); ????int?snprintf(char?*buf,size_t?n,const?char?*format,…);
/*printf將格式化數(shù)據(jù)寫到標(biāo)準(zhǔn)輸出,fprintf寫到指定的流,sprintf將格式化的字符串送到數(shù)組buf中。snprintf指定buf長(zhǎng)度n*/
在工作中經(jīng)常使用snprintf,比如剛剛開發(fā)完靜態(tài)路由是用到的:
格式化輸入函數(shù)(和輸出類似):
????int?scanf(const?*format,…); ????int?fscanf(FILE?*fp,const?*format,..); ????int?sscanf(const?char?*buf,const?char?*format,…);
8、創(chuàng)建臨時(shí)文件函數(shù)
????FILE?*tmpfile(void);/*創(chuàng)建一個(gè)臨時(shí)二進(jìn)制文件wb+,在關(guān)閉該文件或程序結(jié)束時(shí)將自動(dòng)刪除這種文件*/
名稱欄目:Linux標(biāo)準(zhǔn)I/O庫(kù)常用函數(shù)總結(jié)
轉(zhuǎn)載來(lái)于:http://bm7419.com/article4/pcegoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、做網(wǎng)站、云服務(wù)器、商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)