版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第 5 章輸入輸出函數(shù)輸入輸出是指程序與環(huán)境或者用戶之間進行的數(shù)據(jù)或者信息交換,程序必須要有輸入輸出不然就實際作用不大,同樣用戶也需要通過輸入提供程序必要的初始化數(shù)據(jù)、控制程序按照期望的方式運行,程序通過輸出對外部環(huán)境產(chǎn)生某種影響作為程序運行的結(jié)果。5.1文件本節(jié)主要介紹與文件相關(guān)的函數(shù),文件在電腦中可以是文檔、程序、快捷方式,也可能是設(shè)備,文件有文件名和圖標組成,一種類型的文件具有相同的圖標,文件名一般用代碼操作文件的時候可以把文件理解為有序字符的集合,其基本的字符的個數(shù)。過 255 個字符(包括空格)。是字符,長度為該文件包含5.1.1修改文件名 rename()【函數(shù)原型】rename(
2、char* oldname,char* newname)【功能講解】修改文件名,成功返回 0,反則返回-1。【參數(shù)說明】oldname 為原文件名,newname 為新文件名?!境绦蚴纠勘纠炭梢孕薷囊粋€用戶提供的文件名,因為程序要求提供完整路徑,所以如果你提供的路徑與原文件不在一個目錄則相當于實現(xiàn)文件的移動功能?!具\行結(jié)果】請告訴我一個文件的完整路徑:test.ncb您想修改為:test111.ncb/*函數(shù) rename()例子*/ #include #include main(void)char oldname100, newname100;/* prompt for file to
3、rename and new name */ pr f(請告訴我一個文件的完整路徑: ); gets(oldname);pr f(您想修改為: ); gets(newname);/* 更改文件名 */if (rename(oldname, newname) = 0)pr f(已經(jīng)把文件 %s 修改為 %s.n, oldname, newname);elseperror(rename); return 0;已經(jīng)把文件test.ncb 修改為test111.ncb【】例子首先定義兩個數(shù)組用戶指定的文件名,接著使用 gets 接收用戶輸入的文件名,再使用 rename()修改,如果成功則返回值為 0
4、 提示修改成功。5.1.2打開文件 open()【函數(shù)原型】open(char* pathname,acs,permiss)【功能講解】從控制臺一個字符,但是不顯示在屏幕上,返回值為的字符值?!緟?shù)說明】pathname 為帶路徑的文件名,acs 為打開的模式,permiss 為文件權(quán)限?!境绦蚴纠勘纠淘诋斍澳夸泟?chuàng)建一個文件并寫入一個字符串?!具\行結(jié)果】I have create a file text.txt【】這個例子先是打開文件 test.txt,如果不存在則創(chuàng)建該文件因為打開的時候使用的為O_CREAT,然后使用 write 把字符串寫入文件,并提示是否成功,最后關(guān)閉文件流。Ope
5、n 函數(shù)的參數(shù)acs有許多可選項用于描述文件的打開創(chuàng)建模式,比如 O_RDONLY 只讀模式、O_WRONLY 只寫模式、O_RDWR 讀寫模式、打開/創(chuàng)建文件時,至少使用上述三個常量中的一個,一下常量是選用的:O_APPEND每次讀寫操作都寫入文件的末尾、O_CREAT 如果指定的文件不存在則創(chuàng)建這個文件、O_EXCL 如 果/*函數(shù) open()例子*/ #include #include #include #includemain(void)handle;char msg = 函數(shù) open 例子open(char* pathname,acs,permiss); len = 0;hand
6、le = open(test.txt,O_RDWR|O_CREAT|O_TEXT);/*打開*/if(-1 = handle)perror(Error); return 1;len = strlen(msg);/*字符長度*/ len = write(handle,msg,len); if(-1 = len)perror(Error); return 1;elsepr f(I have create a file text.txtn);close(handle); return 0;要創(chuàng)建的文件已經(jīng)存在則返回-1,并且修改 errno 值、O_TRUNC 如果文件存在,并且以只讀/寫的方式打開
7、,則清空文件的全部內(nèi)容,O_NOCTTY 如果路徑名指向終端設(shè)備,這個設(shè)備用作控制終端、O_NONBLOCK 如果路徑名指向 FIFO/塊文件/字符文件,則把文件的打開和后續(xù) I/O 設(shè)置為非阻塞模式。5.1.3新建文件 creat()【函數(shù)原型】create(char* pathname,mode_tmode)【功能講解】將數(shù)據(jù)寫入已經(jīng)打開的文件,成功則返回寫入的字節(jié)個數(shù),失敗則返回-1。【參數(shù)說明】pathname 為文件名,mode 為模式?!境绦蚴纠勘纠虨樵诋斍澳夸泟?chuàng)建文件 test.bin,并寫入一個字符串。【運行結(jié)果】write suc【sfully!】例子在調(diào)用 creat
8、函數(shù)的時候指明可讀可寫模式,然后write 一個字符串,如果成功則提示寫成功,最后關(guān)閉文件。5.1.4創(chuàng)建一個新文件 creatnew()【函數(shù)原型】creatnew(char* filename,attrib)【功能講解】創(chuàng)建一個新文件,返回值問文件的句柄,失敗則返回-1?!緟?shù)說明】filename 文件名,attrib 為屬性。【程序示例】本例程創(chuàng)建一個文件,如果已經(jīng)存在則提示已經(jīng)存在。/*函數(shù) creatnew()例子*/ #include #include #include #include #includemain(void)/*函數(shù) create()例子*/ #include #
9、include #include #includemain(void)handle;char msg100 = create(char* pathname,mode_tmode); handle = creat(textbin.bin,S_IREAD|S_IWRITE);/*創(chuàng)建*/ if(-1 !=write(handle,msg,strlen(msg)/*寫入文件*/pr f(write sucsfully!n);close(handle);/*關(guān)閉*/ return 0;【運行結(jié)果】Test.txt already exists.【】因為我在程序的當前目錄已經(jīng)建立了一個文件 test.t
10、xt 所以運行結(jié)果為文件已經(jīng)存在,其中參數(shù)attrib 的值可以是 0、1、2。5.1.5從文件中讀 read()【函數(shù)原型】read(handle,void* buf,nbyte)【功能講解】從 handle 所指的文件中果有錯誤發(fā)生則返回-1。nbyte 個字符到 buf 中。返回值為實際的字節(jié)數(shù),如【參數(shù)說明】handle 為文件句柄,buf 為字節(jié)位置,nbyte 為要的字節(jié)個數(shù)?!境绦蚴纠坷訛榇蜷_一個文件把其中的內(nèi)容全部讀出,寫入另一個新文件。/*函數(shù) read()例子*/ #include #include #include #include #includemain(void
11、)fd; fdnew;size_read; char buffer80;fd = open(test.txt,O_RDONLY);fdnew = open(testnmew.txt,O_WRONLY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE); if(fdnew = -1)pr f(Error open file.n); return -1;size_read = read(fd,buffer,sizeof(buffer); while(size_read0)/*循環(huán)數(shù)據(jù)*/handle;char msg100 = createnew(char* filename,at
12、trib); handle = creatnew(test.txt,0);/*創(chuàng)建文件*/if(-1 = handle)/*輸出結(jié)果*/pr f(test.txt already exists.n);elsepr f(test.txt sucsfully created.n); write(handle,msg,strlen(msg); close(handle);return 0;【運行結(jié)果】函數(shù) open 例子open(char* pathname,acs,permiss)【】例子運行顯示的結(jié)果是一個字符串,而且在程序運行的當前目錄還生成了一個新文件testnmew.txt,它的內(nèi)容就是原
13、文件 test.txt 中的內(nèi)容。例子顯示定義兩個文件句柄用于指向新舊兩個文件,當打開兩個文件后就使用read 函數(shù)原文件中的字符 write 寫入新文件中,最后關(guān)閉兩個文件。5.1.6往已經(jīng)打開的文件中寫數(shù)據(jù) write()【函數(shù)原型】write(handle,void* buf,nbyte)【功能講解】往文件中寫入數(shù)據(jù),成功則返回實際寫入的字節(jié)個數(shù),失敗則返回-1?!緟?shù)說明】handle 文件句柄,buf 數(shù)據(jù)存放地址,nbyte 為字節(jié)個數(shù)?!境绦蚴纠坷訛榇蜷_一個文件把其中的內(nèi)容全部讀出,寫入另一個新文件。/*函數(shù) write()例子*/ #include #include #in
14、clude #include #includemain(void)fd; fdnew;size_read; char buffer80;fd = open(test.txt,O_RDONLY);/*打開文件*/fdnew = open(testnmew.txt,O_WRONLY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE); if(fdnew = -1)pr f(Error open file.n); return -1;if(size readsizeof(buffer)buffersize read=0;pr f(%sn,buffer); write(fdnew,bu
15、ffer,size read);size read = read(fd,buffer,sizeof(buffer)-1);if(size_read = -1)/*如果出錯*/perror(Error reading test.txt); return -1;close(fd); close(fdnew); return 0;【運行結(jié)果】函數(shù) open 例子open(char* pathname,acs,permiss)【】例子運行顯示的結(jié)果是一個字符串,而且在程序運行的當前目錄還生成了一個新文件testnmew.txt,它的內(nèi)容就是原文件 test.txt 中的內(nèi)容。例子顯示定義兩個文件句柄用
16、于指向新舊兩個文件,當打開兩個文件后就使用read 函數(shù)原文件中的字符 write 寫入新文件中,最后關(guān)閉兩個文件。5.1.7文件句柄 dup()【函數(shù)原型】【功能講解】dup(fd)文件句柄。【參數(shù)說明】fd 文件句柄或者稱為文件描述。【程序示例】定義一個句柄使其指向輸出,輸出一句話,然后重新定向輸出到一個文件,往文件寫入一句話。/*函數(shù) dup()例子*/ #include #include #include #include #includemain(void)oldhandle; FILE* fnew;oldhandle = dup(1);/*指向 stdout,1 就是stdout*
17、/if(-1 = oldhandle)perror(_dup(1) failure);size read = read(fd,buffer,sizeof(buffer); while(size_read0)/*循環(huán)數(shù)據(jù)*/if(size readsizeof(buffer)buffersize read=0;pr f(%sn,buffer); write(fdnew,buffer,size read);size read = read(fd,buffer,sizeof(buffer)-1);if(size_read = -1)/*如果出錯*/perror(Error reading test.
18、txt); return -1;close(fd); close(fdnew); return 0;【運行結(jié)果】【】例子定義兩個文件句柄,使用 dup 把 oldhandle 指向輸出 stdout。緊接著往 oldhandle寫數(shù)據(jù),你會發(fā)現(xiàn)數(shù)據(jù)寫到了輸出 stdout,因為現(xiàn)在 oldhandle 指向 stdout。然后是 fnew 句柄,先把它指向一個新建的文件 data,再把輸出 stdout 與 fnew 使用 dup2 關(guān)聯(lián)起來,現(xiàn)在開始往輸出 stdout 輸出數(shù)據(jù)你會發(fā)現(xiàn)數(shù)據(jù)沒有在 stdout 上顯示,因為數(shù)據(jù)被寫到文件 data 里面了。最后重新指向 stdout,斷開其
19、與 data 的關(guān)聯(lián)。5.1.8文件句柄 dup2()【函數(shù)原型】dup2(fd1,fd2)【功能講解】把一個字符退回到鍵盤緩沖區(qū)。【參數(shù)說明】fd1 目的文件句柄,fd2 源文件句柄?!境绦蚴纠慷x一個句柄使其指向輸出,輸出一句話,然后重新定向輸出到一個文件,往文件寫入一句話。/*函數(shù) dup2()例子*/ #include #include #include #include #includemain(void)This goes to stdoutThis goes to sdtoutexit(1);write(oldhandle,This goes to stdoutrn,27);
20、if( (fnew = fopen(data,w) = NULL)puts(Cant open file datan); exit(1);if(-1 = dup2(fileno(fnew),1)/*stdout 現(xiàn)在指向文件 data*/perror(Cant dup2 stdout); exit(1);puts(This goes to file datarn);/*刷新下 stdout 字節(jié)緩沖區(qū)*/ fflush(stdout);fclose(fnew);/*恢復指向*/ dup2(oldhandle,1); puts(This goes to stdoutn); return 1;【運
21、行結(jié)果】【】例子定義兩個文件句柄,使用 dup 把 oldhandle 指向輸出 stdout。緊接著往 oldhandle寫數(shù)據(jù),你會發(fā)現(xiàn)數(shù)據(jù)寫到了輸出 stdout,因為現(xiàn)在 oldhandle 指向 stdout。然后是 fnew 句柄,先把它指向一個新建的文件 data,再把輸出 stdout 與 fnew 使用 dup2 關(guān)聯(lián)起來,現(xiàn)在開始往輸出 stdout 輸出數(shù)據(jù)你會發(fā)現(xiàn)數(shù)據(jù)沒有在 stdout 上顯示,因為數(shù)據(jù)被寫到文件 data 里面了。最后重新指向 stdout,斷開其與 data 的關(guān)聯(lián)。5.1.9檢測文件結(jié)束 eof()【函數(shù)原型】eof(* handle)【功能講解
22、】檢測文件結(jié)束,結(jié)束返回 1,否則返回 0?!緟?shù)說明】handle 文件句柄?!境绦蚴纠縿?chuàng)建一個文件寫一段數(shù)據(jù)然后逐個字符讀出。/*函數(shù) eof()例子*/ #include #include#includeThis goes to stdoutThis goes to sdtouoldhandle; FILE* fnew;oldhandle = dup(1);/*指向 stdout,1 就是stdout*/if(-1 = oldhandle)perror( dup(1) failure); exit(1);write(oldhandle,This goes to stdoutrn,27)
23、; if( (fnew = fopen(data,w) = NULL)puts(Cant open file datan); exit(1);if(-1 = dup2(fileno(fnew),1)/*stdout 現(xiàn)在指向文件 data*/perror(Cant dup2 stdout); exit(1);puts(This goes to file datarn);/*刷新下 stdout 字節(jié)緩沖區(qū)*/ fflush(stdout);fclose(fnew);/*恢復指向*/ dup2(oldhandle,1); puts(This goes to stdoutn); return 1;
24、【運行結(jié)果】This is a test【】程序先是使用 open 函數(shù)創(chuàng)建一個空文件,然后使用 write 寫入一個字符串,再使用 lseek 定位文件指針到文件的開頭,再使用 do-while 循環(huán)逐個 read文件字符輸出,直到 eof 檢測到文件結(jié)尾。5.1.14移動文件讀寫指針 lseek()【函數(shù)原型】lseek(handle,long offset,fromwhere)【功能講解】移動文件的讀寫指針,成功則返回當前的讀寫位置,也就是距離文件開頭有多少個字節(jié),若有錯誤則返回-1?!緟?shù)說明】handle 文件句柄,offset 偏移量,每一讀寫操作所需要移動的距離。fromwher
25、e 出發(fā)點【程序示例】從文件頭逐個輸出文件中的字節(jié)。/*函數(shù) lseek()例子*/ #include #include #include #include #includemain(void)handle;#include #includemain(void)handle;char msg = This is a test; char ch;/*創(chuàng)建一個文件*/handle = open(tes1t.txt,O CREAT|O RDWR,S IREAD|S IWRITE);/*往文件寫數(shù)據(jù)*/ write(handle,msg,strlen(msg);/*定位文件開頭*/lseek(hand
26、le,0L,SEEK SET);/*逐個直到結(jié)束*/ doread(handle,&ch,1); pr f(%c,ch);while(!eof(handle); close(handle); return 0;【運行結(jié)果】This is a testr【】程序先是使用 open 打開文件 tes1t.txt,然后使用 write 把字符數(shù)組 msg 中的字符都寫入文件中,再使用 lseek 把文件的讀寫指針定位在文件的開頭,然后使用 do-while 循環(huán)逐個輸出文件中的字符,就是程序運行的結(jié)果。需明一點參數(shù) fromwhere 為下列中的一個:SEEK_SET 將讀寫位置指向文件頭后再增加
27、offset 個位移量、SEEK_CUR 以目前的讀寫位置為后增加 offset 個位移量、SEEK_END 將讀寫位置指向文件尾后再增加offset 個位移量。5.1.15l()獲取文件指針的當前位置【函數(shù)原型】longl(handle)【功能講解】獲取文件指針的當前位置,返回值就是文件的讀寫指針當前距離文件愛你開頭的字節(jié)數(shù)?!緟?shù)說明】handle 為文件句柄【程序示例】逐個文件的字節(jié),并輸出當前讀寫指針的位置。/*函數(shù)l()例子*/ #include #include #include #include #includemain(void)handle;char msg = This i
28、s a test; char ch;/*創(chuàng)建一個文件*/handle = open(tes1t.txt,O_CREAT|O_RDWR,S_IREAD|S_IWRITE);char msg = This is a test; char ch;/*創(chuàng)建一個文件*/handle = open(tes1t.txt,O CREAT|O RDWR,S IREAD|S IWRITE);/*往文件寫數(shù)據(jù)*/ write(handle,msg,strlen(msg);/*定位文件開頭*/lseek(handle,0L,SEEK SET);/*逐個直到結(jié)束*/ doread(handle,&ch,1); pr f
29、(%c,ch);while(!eof(handle); close(handle); return 0;【運行結(jié)果】【】程序顯示創(chuàng)建一個空文件,然后寫入一個字符串,使用 lseek 把讀寫指針定位到文件開頭,使用 read逐個并輸出當前位置,直到文件結(jié)束。5.1.16獲取設(shè)備類型 isatty()【函數(shù)原型】isatty(handle)【功能講解】獲取設(shè)備類型,如果是則返回 1,否則返回 0。【參數(shù)說明】handle 為文件句柄【程序示例】檢測輸出設(shè)備是不是設(shè)備。/*函數(shù) isatty()例子*/ #include #includemain(void)handle;handle = filen
30、o(stdout);/*設(shè)備號*/if(isatty(handle)/*獲取設(shè)備類型*/pr f(Handle %d is a device type.n,handle);elsepr f(Handle %d isnt a device type.n,handle);TThe file pois at byte 1 hThe file pois at byte 2 iThe file pois at byte 3/*往文件寫數(shù)據(jù)*/ write(handle,msg,strlen(msg);/*定位文件開頭*/lseek(handle,0L,SEEK SET);/*逐個直到結(jié)束*/ dorea
31、d(handle,&ch,1); pr f(%cn,ch);pr f(The file pois at byte %ldn, l(handle);while(!eof(handle); close(handle); return 0;【運行結(jié)果】Handle 1 is a device type【】程序先獲取輸出 stdout 句柄,然后使用 isatty 判斷其是不是設(shè)備,如果返回值為 1 則是設(shè)備否則不是。順便輸出 stdout 的句柄是 1,所以才有上面的運行結(jié)果。5.1.17設(shè)置文件共享鎖 lock()【函數(shù)原型】lock(handle,long offset,long length)
32、【功能講解】設(shè)置文件共享鎖,成功返回 0 否則返回-1。【參數(shù)說明】handle 為文件句柄,offset 偏移量,length 長度。【程序示例】先鎖定一個文件然后。【運行結(jié)果】/*函數(shù) lock()例子 運行在TC2.0*/ #include #include #include #include #include #include main(void)handle, sus; long length;/* 需要 DOS Share.exe 提供支持*/handle = sopen(c:autoexec.bat,/*打開*/ O_RDONLY,SH_DENYNO,S_IREAD);if (h
33、andle 0)pr f(sopen failedn); exit(1);length = filelength(handle);sus = lock(handle,0L,length/2);/*上鎖*/ if (s us = 0)pr f(lock succeededn); elsepr f(lock failedn);sus = unlock(handle,0L,length/2);/*/ if (s us = 0)pr f(unlock succeededn);elsepr f(unlock failedn); close(handle);return 0;return 0;【】程序先獲
34、取文件句柄,然后使用 filelength 獲取文件的長度,接著使用 lock 函數(shù)鎖定文件共享,根據(jù)返回值判定是否成功,函數(shù)unlock 同理,根據(jù)返回值判斷是否成功。5.1.18解除文件共享鎖 unlock()【函數(shù)原型】unlock(handle,long offset,long length)【功能講解】解除文件共享鎖,成功返回 0,否則返回-1。【參數(shù)說明】handle 為文件句柄,offset 偏移量,length 長度?!境绦蚴纠肯孺i定一個文件然后?!具\行結(jié)果】【】程序先獲取文件句柄,然后使用 filelength 獲取文件的長度,接著使用 lock 函數(shù)鎖定lock sucs
35、dedunlock succeded/*函數(shù) unlock()例子 運行在 TC2.0*/ #include #include #include #include #include #include main(void)handle, sus; long length;/* 需要 DOS Share.exe 提供支持*/handle = sopen(c:autoexec.bat,/*打開*/ O RDONLY,SH DENYNO,S IREAD);if (handle 0)pr f(sopen failedn); exit(1);length = filelength(handle);sus
36、= lock(handle,0L,length/2);/*上鎖*/ if (s us = 0)pr f(lock succeededn); elsepr f(lock failedn);sus = unlock(handle,0L,length/2);/*/ if (s us = 0)pr f(unlock succeededn);elsepr f(unlock failedn); close(handle);return 0;lock sucsdedunlock succeded文件共享,根據(jù)返回值判定是否成功,函數(shù)unlock 同理,根據(jù)返回值判斷是否成功。5.1.19關(guān)閉文件 close
37、()【函數(shù)原型】clsoe(handle)【功能講解】關(guān)閉文件,成功返回 0,否則返回-1?!緟?shù)說明】handle 為文件句柄?!境绦蚴纠看蜷_一個文件,逐個輸出文件字符后關(guān)閉。【運行結(jié)果】TThe file pois at byte 1 hThe file pois at byte 2 iThe file pois at byte 3 Closed/*函數(shù) close()例子*/ #include #include #include #include #includemain(void)handle;char msg = This is a test; char ch;/*創(chuàng)建一個文件*/
38、handle = open(tes1t.txt,O_CREAT|O_RDWR,S_IREAD|S_IWRITE);/*往文件寫數(shù)據(jù)*/ write(handle,msg,strlen(msg);/*定位文件開頭*/lseek(handle,0L,SEEK_SET);/*逐個直到結(jié)束*/ doread(handle,&ch,1); pr f(%cn,ch);pr f(The file pois at byte %ldn, l(handle);while(!eof(handle); if(0=close(handle)pr f(closedn);return 0;【】程序顯示創(chuàng)建一個空文件,然后寫
39、入一個字符串,使用 lseek 把讀寫指針定位到文件開頭,使用read 逐個并輸出當前位置,直到文件結(jié)束,最后關(guān)閉文件。5.1.20打開一個文件 fopen()【函數(shù)原型】FILE* fopen(char* path,char* mode)【功能講解】打開一個文件,成功返回文件指針,失敗則返回NULL?!緟?shù)說明】path 為文件路徑名,mode 代表流的形態(tài),具體見中的說明。【程序示例】打開一個文件,逐個字符,最后關(guān)閉該文件。【運行結(jié)果】【完。這里需】函數(shù) fopen 利用模式 at+打開文本文件,使用 getc 從文件流中逐個明的就是 mode 參數(shù),字符,直到讀This is a tes
40、to! I have read this file./*函數(shù) fopen()例子*/ #include #include #includemain(void)ch; len; i=0;FILE* fstream;char msg100 = o!I have read this file.; fstream=fopen(test.txt,at+); if(fstream=NULL)pr f(read file test.txt failed!n); exit(1);/getc 從文件流中字符while( (ch = getc(fstream)!=EOF)phar(ch);phar(n);len
41、= strlen(msg);while(len0)/*循環(huán)寫入*/p(msgi,fstream);phar(msgi); len-;i+;fclose(fstream); return 0;r:以只讀方式打開文件,該文件必須存在。 r+:以讀寫方式打開文件,該文件必須存在。 rb+:讀寫打開一個二進制文件,只允許讀寫數(shù)據(jù)。 rt+:讀寫打開一個文本文件,允許讀和寫。w:打開只寫文件,若文件存在則長度清為 0,即該文件內(nèi)容,若不存在則創(chuàng)建該文件。w+:打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會建立該文件。a:以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫
42、入的數(shù)據(jù)會被加到文件尾,即文件原先的內(nèi)容會被保留。(EOF 符保留)a+:以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數(shù)據(jù)會被加到文件尾后,即文件原先的內(nèi)容會被保留。 (原來的EOF 符不保留)wb:只寫打開或新建一個二進制文件;只允許寫數(shù)據(jù)。 wb+:讀寫打開或建立一個二進制文件,允許讀和寫。 wt+:讀寫打開或著建立一個文本文件;允許讀寫。 wt+:讀寫打開或著建立一個文本文件;允許讀寫。 at+:讀寫打開一個文本文件,允許讀或在文本末追加數(shù)據(jù)。ab+:讀寫打開一個二進制文件,允許讀或在文件末追加數(shù)據(jù)。若文件不存在則5.1.21字符 getc()從流中【函
43、數(shù)原型】getc(FILE* stream)【功能講解】從流中字符,返回值就是的字符?!緟?shù)說明】stream 文件流指針?!境绦蚴纠坷?getc 從文件中字符。/*函數(shù) getc()例子*/ #include #include #includemain(void)ch; len; i=0;FILE* fstream;char msg100 = o!I have read this file.; fstream=fopen(test.txt,at+); if(fstream=NULL)pr f(read file test.txt failed!n); exit(1);/*getc 從文件
44、流中字符*/ while( (ch = getc(fstream)!=EOF)phar(ch);【運行結(jié)果】【完?!亢瘮?shù) fopen 利用模式 at+打開文本文件,使用 getc 從文件流中逐個字符,直到讀5.1.22往指定流中輸入一個字符 p()【函數(shù)原型】p(ch,FILE* stream)【功能講解】往指定流中輸入一個字符,正確則返回輸入的字符,錯誤則返回 EOF?!緟?shù)說明】ch 為要輸入的字符,stream 為文件流指針?!境绦蚴纠縿?chuàng)建一個新文件,然后利用 p寫入字符串。/*函數(shù) p ()例子*/ #include #include #includemain(void)ch; le
45、n; i=0;FILE* fstream;char msg100 = o!I have read this file.; fstream=fopen(test.txt,at+); if(fstream=NULL)pr f(read file test.txt failed!n); exit(1);/*getc 從文件流中字符*/ while( (ch = getc(fstream)!=EOF)phar(ch);phar(n);This is a testo! I have read this filephar(n);len = strlen(msg); while(len0)/*循環(huán)寫入*/p
46、(msgi,fstream);phar(msgi); len-;i+;fclose(fstream); return 0;【運行結(jié)果】o! I have read this file.【】程序使用 fopen 函數(shù)以文本方式讀寫一個文件,因為文件是新建的所以內(nèi)容為空,故第一個 while 循環(huán)沒有輸出任何內(nèi)容。接著 strlen 函數(shù)獲取字符數(shù)組的長度,再次 while 循環(huán)逐個往文件寫字符。最后關(guān)閉文件?,F(xiàn)在查看程序運行目錄應該會有一個 test.txt 文件,內(nèi)容是:file.o! I have read this5.1.23從流中整數(shù) getw()【函數(shù)原型】getw(FILE* fp)
47、【功能講解】從流中一個整數(shù),返回值為的整數(shù),如果文件結(jié)束或者出錯則返回-1?!緟?shù)說明】fp 為文件流指針?!境绦蚴纠客募懸粋€整數(shù),然后讀出來。/*函數(shù) getw()例子*/ #include #include #includemain(void)ch; len; i=0;FILE* fstream;/*w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會。若文件不存在則建立該文件*/ fstream=fopen(test.txt,w+);if(fstream=NULL)pr f(read file test.txt failed!n); exit(1);/*getc 從文件
48、流中字符*/ while( (ch = getc(fstream)!=EOF)phar(ch);phar(n);len = strlen(msg); while(len0)/*循環(huán)輸入*/p(msgi,fstream);phar(msgi); len-;i+;fclose(fstream); return 0;【運行結(jié)果】【然后 while 循環(huán)】程序開始先建立一個新文件 test.txt,如果存在則清空其內(nèi)容,具體可參看函數(shù) fopen(),文件內(nèi)容,以確定內(nèi)容卻是為空。接著使用 putw 把一個整數(shù) 35 寫入文件中,同時檢測是否發(fā)生錯誤,有則提示出錯,正確則提示成功寫入文件。既然已經(jīng)寫入
49、則可以使用 getw文件中的整數(shù),把的整數(shù)打印出來,關(guān)閉文件。5.1.24向流中寫整數(shù) putw()【函數(shù)原型】putw(w,FILE* stream)【功能講解】將整數(shù)寫入文件流中,成功則返回整數(shù),出錯則返回 EOF?!緟?shù)說明】w 為要寫入的整數(shù),stream 為文件流指針。【程序示例】往文件寫一個整數(shù),然后讀出來。/*函數(shù) putw()例子*/ #include #include #includemain(void)ch; len; i=0;FILE* fstream;Sucs writing to file.Readis:35len = 35; putw(len,fstream); i
50、f(ferror(fstream)pr f(Error writing to file.n);elsepr f(Sucs writing to file.n);fclose(fstream);fstream = fopen(test.txt,r);/*打開文件*/ if(fstream = NULL)pr f(Error opening file test.txtn); exit(1);len = 0;len = getw(fstream);/*整數(shù)*/ pr f(Readis:%dn,len); fclose(fstream);return 0;【運行結(jié)果】【然后 while 循環(huán)】程序開始
51、先建立一個新文件 test.txt,如果存在則清空其內(nèi)容,具體可參看函數(shù) fopen(),文件內(nèi)容,以確定內(nèi)容卻是為空。接著使用 putw 把一個整數(shù) 35 寫入文件中,同時檢測是否發(fā)生錯誤,有則提示出錯,正確則提示成功寫入文件。既然已經(jīng)寫入則可以使用 getw文件中的整數(shù),把的整數(shù)打印出來,關(guān)閉文件。5.1.25把一個字符退回到輸入流中 ungetc()【函數(shù)原型】ungetc(char c,FILE* stream)Sucs writing to file.Readis:35/*w+,打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會。若文件不存在則建立該文件*/ fstream=
52、fopen(test.txt,w+);if(fstream=NULL)pr f(read file test.txt failed!n); exit(1);/*getc 從文件流中字符*/ while( (ch = getc(fstream)!=EOF)phar(ch);phar(n); len = 35;putw(len,fstream); if(ferror(fstream)pr f(Error writing to file.n);elsepr f(Sucs writing to file.n);fclose(fstream);fstream = fopen(test.txt,r);/*
53、打開*/ if(fstream = NULL)pr f(Error opening file test.txtn); exit(1);len = 0;len = getw(fstream);/*整數(shù)*/ pr f(Readis:%dn,len);fclose(fstream); return 0;【功能講解】把一個字符退回到輸入流中,成功則返回該字符的值,失敗則返回 EOF?!緟?shù)說明】c 為字符,stream 為流指針。【程序示例】分解整數(shù)和字符?!具\行結(jié)果】【】這是一個比較有意思的例子,要求用戶輸入一個整數(shù)加字符。While 循環(huán)再不停的檢測用戶的輸入,如果不是結(jié)束且是數(shù)字的話就按照整數(shù)的
54、形式保存起來,否則,如果不是結(jié)束則退回到輸入流當中,因為它肯定是字符,這樣在輸出分析結(jié)果的時候就能直接輸出整數(shù),然后從流中從新 getchar字符。5.1.26送一個字符到流中 fp()【函數(shù)原型】fp(ch,FILE* stream)【功能講解】送一個字符到流中,成功則返回該字符,失敗返回EOF?!緟?shù)說明】ch 要送的字符,stream 為流指針?!境绦蚴纠坷胒p往文件寫入一個字符串,然后使用 fgetc 獲取并顯示出來。/*函數(shù) fp()例子*/ #include #include #include #includemain(void)Input aneger followed by
55、 a char:12ai = 12,next char in buffer =a./*函數(shù) ungetc 例子*/把一個字符退回到輸入流中ungetc(char c, FILE *stream); #include#include main()i=0;char ch;puts(Input aneger followed by a char:);/*字符知道遇到結(jié)束符或者非數(shù)字字符*/ while(ch = getchar() != EOF & isdigit(ch)i = 10 * i + ch - 48; /* 轉(zhuǎn)為整數(shù) */* 如果不是數(shù)字,則放回緩沖區(qū) */ if (ch != EOF)
56、ungetc(ch,stdin);pr f(nni = %d, next char in buffer = %cn, i, getchar(); system(pause);return 0;【運行結(jié)果】This is a test!【】程序開始利用 fopen 函數(shù)新建一個空文件 test.txt,使用 while 循環(huán)逐個字符 fp寫入文件,刷新關(guān)閉文件,然后以只讀的方式打開該文件,連續(xù) fgetc標識。文件中的字符并輸出顯示,直到遇到文件結(jié)束5.1.27從流中一個字符 fgetc()【函數(shù)原型】fgetc(FILE* stream)【功能講解】從流中一個字符,返回值為讀到的字符,遇到文件
57、結(jié)尾返回 EOF。【參數(shù)說明】stream 為文件流指針?!境绦蚴纠坷胒p往文件寫入一個字符串,然后使用 fgetc 獲取并顯示出來。/*函數(shù) fp()例子*/ #include #include #include #includemain(void)char msg = This is a test!n;char msg = This is a test!n; char msgget100;i = 0;FILE* fstream;fstream = fopen(test.txt,w+);/*打開*/ if(fstream=NULL)pr f(Open file failed!n); ex
58、it(1);while (msgi)fp(msgi, fstream); i+;fflush(fstream); close(fstream);fstream=fopen(test.txt,r);/*打開*/i = 0;while (msggeti=fgetc(fstream)!=EOF)/*循環(huán)輸出*/fp(msggeti), stdout); i+;return 0;【運行結(jié)果】This is a test!【】程序開始利用 fopen 函數(shù)新建一個空文件 test.txt,使用 while 循環(huán)逐個字符 fp寫入文件,刷新關(guān)閉文件,然后以只讀的方式打開該文件,連續(xù) fgetc標識。文件中
59、的字符并輸出顯示,直到遇到文件結(jié)束5.1.28從流中一行或者指定個數(shù)字符 fgets()【函數(shù)原型】char* fgets(char* s,n,FILE* stream)【功能講解】從流中一行或者指定個數(shù)字符,成功則返回 s 的指針,否則返回NULL?!緟?shù)說明】s 為結(jié)果數(shù)據(jù)的首地址,n-1 為一次讀入數(shù)據(jù)的長度,stream 為文件流?!境绦蚴纠渴褂胒puts 寫一個文件,然后使用fgets該文件并顯示。/*函數(shù) fgets()例子*/ #include #include #include #includemain(void)char msg = This is a test!n sec
60、end linen; char msgget100;i = 0;char msgget100; i = 0;FILE* fstream;fstream = fopen(test.txt,w+);/*打開*/ if(fstream=NULL)pr f(Open file failed!n); exit(1);while (msgi)/*循環(huán)寫入文件*/fp(msgi, fstream); i+;fflush(fstream); close(fstream); fstream=fopen(test.txt,r); i = 0;while (msggeti=fgetc(fstream)!=EOF)f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)房屋買賣合同的簽訂策略
- 產(chǎn)品服務合同的合同變更
- 優(yōu)化采購合同管理的技巧
- 家具采購協(xié)議書樣式
- 家政服務合同風險防范
- 補充合同內(nèi)容范例
- 地區(qū)代理招商合同文本
- 簽訂勞務分包合同的要點分析
- 地坪工程勞務分包
- 購銷合同中英文版談判技巧
- 河南省鄭州市管城區(qū)卷2023-2024學年數(shù)學四年級第一學期期末聯(lián)考試題含答案
- 班主任考核細則評分表
- 露天開采礦山安全生產(chǎn)考核表
- 2023教科版二年級上冊科學課堂作業(yè)本參考答案
- 乘坐飛機申請單
- 譯林牛津版九年級英語上冊期末復習課件全套一
- 出租房屋治安管理責任書
- 湖南師范大學法學院刑事訴訟期末考試
- 作文片段訓練之動作描寫課件
- 江津慈云首屆生態(tài)年豬文化節(jié)活動安排
- 二年級上冊數(shù)學說課稿-8.1 乘除法的復習丨蘇教版
評論
0/150
提交評論