![C語言入門學(xué)習(xí)文件筆記_第1頁](http://file4.renrendoc.com/view/e810768ac2549aaf1a8083ffcbe1925c/e810768ac2549aaf1a8083ffcbe1925c1.gif)
![C語言入門學(xué)習(xí)文件筆記_第2頁](http://file4.renrendoc.com/view/e810768ac2549aaf1a8083ffcbe1925c/e810768ac2549aaf1a8083ffcbe1925c2.gif)
![C語言入門學(xué)習(xí)文件筆記_第3頁](http://file4.renrendoc.com/view/e810768ac2549aaf1a8083ffcbe1925c/e810768ac2549aaf1a8083ffcbe1925c3.gif)
![C語言入門學(xué)習(xí)文件筆記_第4頁](http://file4.renrendoc.com/view/e810768ac2549aaf1a8083ffcbe1925c/e810768ac2549aaf1a8083ffcbe1925c4.gif)
![C語言入門學(xué)習(xí)文件筆記_第5頁](http://file4.renrendoc.com/view/e810768ac2549aaf1a8083ffcbe1925c/e810768ac2549aaf1a8083ffcbe1925c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、文件筆記C文件的有關(guān)基本知識L什么是文件文件有不同的類型,在程序設(shè)計中,主要用到兩種文件:(1)程序文件。包括源程序文件(后綴為.c)、目標文件(后綴為.obj)、可執(zhí)行文件(后 綴 為.exe)等。這種文件的內(nèi)容是程序代碼。(2)數(shù)據(jù)文件。文件的內(nèi)容不是程序,而是供程序運行時讀寫的數(shù)據(jù),如在程序運行過程 中輸出到磁盤(或其他外部設(shè)備)的數(shù)據(jù),或在程序運行過程中供讀入的數(shù)據(jù)。(本章主要討論的是數(shù)據(jù)文件)為了簡化用戶對輸入輸出設(shè)備的操作操作系統(tǒng)把各種設(shè)備都統(tǒng)一作為文件來處理。從操作 系統(tǒng)的角度看,每一個與主機相連的輸入輸出設(shè)備都看作一個文件。例如,終端鍵盤是輸入 文件,顯示屏和打印機是輸出文件。
2、所謂“文件”一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合。一批數(shù)據(jù)是以文件的形式存放在外部介 質(zhì)(如磁盤)上的。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的,也就是說如果想找存放在 外部介質(zhì)上的數(shù)據(jù),必須先按文件名找到所指定的文件,然后再從該文件中讀取數(shù)據(jù)。要向 外部介質(zhì)上存儲數(shù)據(jù)也必須先建立一個文件(以文件名作為標志),才能向它輸出數(shù)據(jù)。輸入輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處,因此常將輸入輸出形象地 稱為流,即數(shù)據(jù)流。流表示了信息從源到目的端的流動。文件是由操作系統(tǒng)進行統(tǒng)一管理的,C語言把文件看作一個字符(或字節(jié))的序列,即由一個一個字符(或字節(jié))的數(shù)據(jù)順序組 成。一個輸入輸出流就是一個字符
3、流或字節(jié)(內(nèi)容為二進制數(shù)據(jù))流。C的數(shù)據(jù)文件由一連串的字符(或字節(jié))組成,而不考慮行的界限.兩行數(shù)據(jù)間不會自動加分 隔符,對文件的存取是以字符(字節(jié))為單位的。輸入輸出數(shù)據(jù)流的開始和結(jié)束僅受程序控 制而不受物理符號(如回車換行符)控制.這就增加了處理的靈活性。這種文件稱為流式文 件。.文件名(文件標識)一個文件要有一個唯一的文件標識,以便用戶識別和弓I用。文件標識包括3局部:(1)文件路徑;(2)文件名主干;(3)文件后綴。文件路徑表示文件在外部存儲設(shè)備中的位置。如:D : CC temp filel. dat文件路徑文件名主干 文件后綴表示filel.dat文件存放在D盤中的CC目錄下的te
4、mp子目錄下面。文件名主干的命名規(guī)那么遵循標識符的命名規(guī)那么。后綴用來表示文件的性質(zhì),如:doc (Word 生成的文件),txt (文本文件),dat (數(shù)據(jù)文件).c (C語言源程序文件),cpp (C+源程 序文件),for (FORTRAN語言源程序文件),pas (Pascal語言源程序文件).obj (目標文 件),exe (可執(zhí)行文件).ppt (電子幻燈文件),bmp (圖形文件)等。.文件的分類根據(jù)數(shù)據(jù)的組織形式.數(shù)據(jù)文件可分為ASCII文件(文本文件)和二進制文件(映像文件)。數(shù)據(jù) 在內(nèi)存中是以二進制形式存儲的,如果不加轉(zhuǎn)換地輸出到外存,就是二進制文件,可以認為它2.隨機讀
5、寫有了 rewind和fseek函數(shù),就可以實現(xiàn)隨機讀寫了。通過下面簡單的例子可以了解怎樣進 行隨機讀寫。文件檢測函數(shù).文件結(jié)束檢測函數(shù)feof函數(shù)調(diào)用格式:feof(文件指針);功能:判斷文件是否處于文件結(jié)束位置,如文件結(jié)束,那么返回值為1,否那么為0o 為了知道對文件的讀寫是否完成,只須看文件讀寫位置是否移到文件的末尾。說明:在文件的所有有效字符后有一個文件尾標志。當(dāng)讀完全部字符后,文件讀寫位置標記 就指向最后一個字符的后面,即指向了文件尾標志。如果再執(zhí)行讀取操作,那么會讀出-1(不要 理解為最后有一個結(jié)束字節(jié),在其中存放了數(shù)值它只是一種處理方法)。文件尾標志用 標識符EOF(end of
6、 file)表示。EOF在stdio. h頭文件中被定義為 例:ch= fgetc(in); 從輸入文件讀入一個字符,賦給變量chwhile( !feof(in) 如果未遇到輸入文件的結(jié)束標志fpute(ch,out); 將ch寫到輸出文件putchar(ch); 將ch顯示到屏幕上ch=fgetc(in); 再從輸入文件讀人一個字符,賦給變量ch putchar( unn );用feof函數(shù)可以檢測文件尾標志是否已被讀取過。如果文件尼標志已被讀出,那么表示文件 已結(jié)束,此時束of函數(shù)值為真(以1表示),否那么他of函數(shù)值為假(以0表示)。不要把feof函 數(shù)值的真和假(0)與文件尾標志的假設(shè)
7、值(-1)相混淆。前者為函數(shù)值,后者為尾標志的假設(shè) 值。程序中的feof(in)用來判斷in所指向的文件是否結(jié)束了。開始時顯然沒有讀到文件尾標志, 故“feof(in)”為假,“ ! feof(in)”為真,所以要執(zhí)行while循環(huán)體。直到讀取完最后一個字符 并輸出到磁盤文件和屏幕后,還再執(zhí)行一次fgetc函數(shù),即讀取文件尾標志了。再返回while 語句檢查循環(huán)條件,此時feof(in)為真了,因此“!feof(in)”為假,不再執(zhí)行while循環(huán)體了。 while語句是可以改為while(ch! = -1)或 while(ch! =EOF).文件讀寫的出錯檢測c提供一些函數(shù)用來檢查輸入輸出函
8、數(shù)調(diào)用時可能出現(xiàn)的錯誤。L讀寫文件出錯檢測函數(shù)(ferror函數(shù))在調(diào)用各種輸入輸出函數(shù)(如putc, getc,fread和(write等)時,如果出現(xiàn)錯誤,除了函數(shù) 返回值有所反映外,還可以用ferror函數(shù)檢查。它的一般調(diào)用形式為terror (fp);如果ferror返回值為。(假),表示未出錯;如果返回一個非零值,表示出錯。應(yīng)該注意,對同一個文件每一次調(diào)用輸入輸出函數(shù),都會產(chǎn)生一個新的ferror函數(shù)值,因此, 應(yīng)當(dāng)在調(diào)用一個輸入輸出函數(shù)后立即檢查ferror函數(shù)的值,否那么信息會喪失。在執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值自動置為0。2.文件出錯標志和文件結(jié)束標志置0函數(shù)
9、(clearerr函數(shù))clearerr的作用是使文件出錯標志和文件結(jié)束標志置為0。假設(shè)在調(diào)用一個輸入輸出函數(shù)時 出現(xiàn)錯誤,feiror函數(shù)值為一個非零值。應(yīng)該立即調(diào)用clearerr ( fp),使ferror (fp)的值變 成0,以便再進行下一次的檢測。只要出現(xiàn)文件讀寫出錯標志,它就一直保存,直到對同一文件調(diào)用clearerr函數(shù)或rewind 函數(shù),或任何其他一個輸入輸出函數(shù)。就是存儲在內(nèi)存的數(shù)據(jù)的映像,所以也稱之為映像文件。如果要求在外存上以ASCII代碼形 式存儲,那么需要在存儲前進行轉(zhuǎn)換。ASCII文件又稱文本文件(text file),每一個字節(jié)存放一 個字符的ASCII代碼。
10、用二進制形式輸出數(shù)值,可以節(jié)省外存空間和轉(zhuǎn)換時間。.文件緩沖區(qū)ANSI C標準采用“緩沖文件系統(tǒng)”處理數(shù)據(jù)文件,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動地在內(nèi) 存區(qū)為程序中每一個正在使用的文件開辟一個文件緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送 到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤去。如果從磁盤向計算機讀入數(shù)據(jù).那么一次 從磁盤文件將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送 到程序數(shù)據(jù)區(qū)(給程序變量)。這樣做是為了節(jié)省存取時間,提高效率,緩沖區(qū)的大小由各個 具體的C編譯系統(tǒng)確定。說明:每一個文件在內(nèi)存中只有一個緩沖區(qū),在向文件輸出數(shù)據(jù)時,它就作為輸出緩沖區(qū),在 從文件輸入數(shù)
11、據(jù)時它就作為輸入緩沖區(qū)。.文件類型指針(文件指針)每個被使用的文件都在內(nèi)存中開辟一個相應(yīng)的文件信息區(qū),用來存放文件的有關(guān)信息(如文 件的名字、文件狀態(tài)及文件當(dāng)前位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu) 體類型是由系統(tǒng)聲明的,取名為FILE。不同的C編譯系統(tǒng)的FILE類型包含的內(nèi)容不完全相同,但大同小異。對以上結(jié)構(gòu)體中的成 員及其含義可不深究,只須知道其中存放文件的有關(guān)信息即可。FILE結(jié)構(gòu)體類型的信息包含在頭文件“stdio.h”中。在程序中可以直接用FILE類型名定義變 量。每一個FILE類型變量對應(yīng)一個文件的信息區(qū),在其中存放該文件的有關(guān)信息。例如,可以定義以下FILE類型的變
12、量:FILE fl ;以上定義了一個結(jié)構(gòu)體變量fl,用它來存放一個文件的有關(guān)信息。這些信息是在翻開一個文 件時由系統(tǒng)根據(jù)文件的情況自動放入的,在讀寫文件時需要用到這些信息,也會修改某些 信息。例如在讀一個字符后,文件信息區(qū)中的位置標記指針的指向就要改變。一般不通過FILE類型變量的名字來引用這些變量,而是設(shè)置一個指向FILE類型變量的指針 變量,然后通過它來引用這些FILE類型變量。下面定義一個指向文件型數(shù)據(jù)的指針變量:FILE* fp ;定義fp是一個指向FILE類型數(shù)據(jù)的指針變量。可以使fp指向某一個文件的文件信息區(qū)(是 一個結(jié)構(gòu)體變量),通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說
13、通過文件指針 變量能夠找到與它關(guān)聯(lián)的文件。如果有n個文件,應(yīng)設(shè)n個指針變量,分別指向n個FILE類 型變量,以實現(xiàn)對n個文件的訪問。通常將這種指向文件信息區(qū)的指針變量簡稱為指向文件的指針變量,注意:指向文件的指針變量并不是指向外部介質(zhì)上的數(shù)據(jù)文件的開頭,而是指向內(nèi)存中的文 件信息區(qū)的開頭。翻開與關(guān)閉文件對文件讀寫之前應(yīng)該“翻開”該文件,在使用結(jié)束之后應(yīng)“關(guān)閉”該文件。所謂翻開”是指為文件建立相應(yīng)的信息區(qū)(用來存放有關(guān)文件的信息)和文件緩沖區(qū)(用 來暫時存放輸入輸出的數(shù)據(jù))。在編寫程序時,在翻開文件的同時,一般都指定一個指針變量指向該文件,也就是建立起指 針變量與文件之間的聯(lián)系,這樣,就可以通過
14、該指針變量對文件進行讀寫了。所謂“關(guān)閉” 是指撤銷文件信息區(qū)和文件緩沖區(qū),使文件指針變量不再指向該文件,顯然就無法進行對文 件的讀寫了。1用fopen函數(shù)翻開數(shù)據(jù)文件ANSI C規(guī)定了用標準輸入輸出函數(shù)fopen來實現(xiàn)翻開文件。fopen函數(shù)的調(diào)用方式為fopen (文件名“,”使用文件方式”);例如:fopen (aln ,nrn );表示要翻開名字為al的文件,使用文件方式為“讀入” (r代表read,即讀入)。fopen函數(shù)的返回值是指向al文件的指針(即al文件信息區(qū)的起始地址)。通常將fopen函 數(shù)的返回值賦給一個指向文件的指針變量。如:FILE*fp ; 定義一個指向文件的指針變
15、量fpfp=fopen (al.M r);將fopen函數(shù)的返回值賦給指針變量fp在翻開一個文件時,通知編譯系統(tǒng)以下3個信息:需要翻開文件的名字,也就是準備訪問 的文件的名字;使用文件的方式(“讀”還是“寫”等);讓哪一個指針變量指向被打 開的文件。使用文件方式如果指定的文件不存在如果指定的文件不存在如果指定的文件不存在文件使用方式 含義w 如果指定的文件不存在w (只寫)a (追加) rb (只讀) wb (只寫) ab (追加)w (只寫)a (追加) rb (只讀) wb w (只寫)a (追加) rb (只讀) wb (只寫) ab (追加)建立新文件出錯出錯建立新文件建立新文件出錯出
16、錯建立新文件出錯向文本文件尾添加數(shù)據(jù)為了輸入數(shù)據(jù)翻開一個二進制文件 為了輸出數(shù)據(jù),翻開一個二進制文件 向二進制文件尾添加數(shù)據(jù)“r+” (讀寫) 為了讀和寫,翻開一個文本文件出錯“w+” (讀寫)為了讀和寫,建立一個新的文本文件建立新文件匕+” (讀寫)為了讀和寫,翻開一個文本文件出錯“由+” (讀寫)為了讀和寫,翻開一個二進制文件出錯“wb+” (讀寫)為了讀和寫,建立一個新的二進制文件建立新文件“ab+” (讀寫)為讀寫翻開一個二進制文件出錯(1)用方式翻開的文件只能用于向計算機輸入而不能用作向該文件輸出數(shù)據(jù),而且該文件 應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才能從文件中讀數(shù)據(jù)。不能用r方式翻開
17、一個并不存 在的文件,否那么出錯。(2)用w方式翻開的文件只能用于向該文件寫數(shù)據(jù)(即輸出文件),而不能用來向計算機輸入。 如果原來不存在該文件,那么在翻開文件前新建立一個以指定的名字命名的文件。如果原來 已存在一個以該文件名命名的文件.那么在翻開文件前先將該文件刪去然后重新建立一個新 文件。(3)如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù)),那么應(yīng)該用a方式翻開。但此 時應(yīng)保證該文件已存在;否那么將得到出錯信息。翻開文件時,文件讀寫位置標記移到文件末 尾。(4)用“r+” “w+”匕+”方式翻開的文件既可用來輸入數(shù)據(jù),也可用來輸出數(shù)據(jù)。用 “r+”方式時該文件應(yīng)該已經(jīng)存在,以便計算機從
18、中讀數(shù)據(jù)。用“w + ”方式那么新建立一個 文件,先向此文件寫數(shù)據(jù),然后可以讀此文件中的數(shù)據(jù)。用匕+ ”方式翻開的文件,原來 的文件不被刪去,文件讀寫位置標記移到文件末尾,可以添加,也可以讀。(5)如果不能實現(xiàn)“翻開”的任務(wù),fopen函數(shù)將會帶回一個出錯信息。出錯的原因可能是: 用r方式翻開一個并不存在的文件;磁盤出故障;磁盤已滿無法建立新文件等。此時fopen 函數(shù)將帶回一個空指針值NUU_(在stdio. h頭文件中,NULL已被定義為0)。常用下面的方法翻開一個文件: if (fp= fopenCfiler/r) = = NULL) (printf(cannot open this f
19、ilcn); exit(0);)即先檢查翻開文件的操作有否出錯,如果有錯就在終端上輸出cannot open this file。exit函 數(shù)的作用是關(guān)閉所有文件,終止正在執(zhí)行的程序,待用戶檢查出錯誤,修改后重新運行。(7)在表10.1中,有12種文件使用方式,其中有6種是在第一個字母后面加了字母b的 (如rb,wb,ab,rb+,wb+,ab+),b表示二進制方式。其實,帶b和不帶b只有一個區(qū)別,即對換 行的處理。由于在C語言用一個大即可實現(xiàn)換行,而在Windows系統(tǒng)中為實現(xiàn)換行必須 要用“回車”和“換行”兩個字符,即和,”因此,如果使用的是文本文件并且用w方 式翻開,在向文件輸出時,遇
20、到換行符時,系統(tǒng)就把它轉(zhuǎn)換為W和n 兩個字符。用 r方式翻開,從文件讀入時,遇到W和兩個連續(xù)的字符.就把它們轉(zhuǎn)換為一個字符。 如果使用的是二進制文件,在向文件讀寫時不需要這種轉(zhuǎn)換。加b表示使用的是二進制文 件,系統(tǒng)就不進行轉(zhuǎn)換。(9)程序中可以使用3個標準的流文件標準輸入流、標準輸出流和標準出錯輸出流。系統(tǒng) 已對這3個文件指定了與終端的對應(yīng)關(guān)系。標準輸人流是從終端的輸入,標準輸出流是向終 端的輸出,標準出錯輸出流是當(dāng)程序出錯時將出錯信息發(fā)送到終端。程序開始運行時系統(tǒng)自動翻開這3個標準流文件。因此程序編寫者不需要在程序中用fopen 函數(shù)翻開它們。所以以前我們用到的從終端輸入或輸出到終端都不需要
21、翻開終端文件。系統(tǒng) 定義了 3個文件指針變量stdin, stdout和stderr,分別指向標準輸入流、標準輸出流和標準 出錯輸出流,可以通過這3個指針變量對以上3種流進行操作,它們都以終端作為輸入輸 出對象。2用fclose函數(shù)關(guān)閉數(shù)據(jù)文件在使用完一個文件后應(yīng)該關(guān)閉它,以防止它再被誤用。“關(guān)閉”就是撤銷文件信息區(qū)和文件 緩沖區(qū),使文件指針變量不再指向該文件。關(guān)閉文件用fclose函數(shù)。fclose函數(shù)調(diào)用的一般形式為fclose (文件指針);例如:fclose (fp);前面曾把翻開文件(用fopen函數(shù))時函數(shù)返回的指針賦給了 fp.現(xiàn)在把fp指向的文件關(guān) 閉,此后fp不再指向該文件。
22、如果不關(guān)閉文件就結(jié)束程序運行將會喪失數(shù)據(jù)。因為,在向文件寫數(shù)據(jù)時,是先將數(shù)據(jù)輸出 到緩沖區(qū),待緩沖區(qū)充滿后才正式輸出給文件。如果當(dāng)數(shù)據(jù)未充滿緩沖區(qū)時程序結(jié)束運行就 有可能使緩沖區(qū)中的數(shù)據(jù)喪失。用fclose函數(shù)關(guān)閉文件時,先把緩沖區(qū)中的數(shù)據(jù)輸出到磁盤 文件,然后才撤銷文件信息區(qū)。fclose函數(shù)也帶回一個值,當(dāng)成功地執(zhí)行了關(guān)閉操作,那么返回值為0;否那么返回EOF(-l)。順序讀寫數(shù)據(jù)文件在順序?qū)憰r,先寫入的數(shù)據(jù)存放在文件中前面的位置,后寫入的數(shù)據(jù)存放在文件中后面的位 置。在順序讀時,先讀文件中前面的數(shù)據(jù),后讀文件中后面的數(shù)據(jù)。也就是說,對順序讀寫 來說,對文件讀寫數(shù)據(jù)的順序和數(shù)據(jù)在文件中的物
23、理順序是一致的。順序讀寫需要用庫函數(shù) 實現(xiàn)(使用以下函數(shù)都要求包含頭文件stdio.h)L怎樣向文件讀寫字符(字符讀寫函數(shù)fgetc和fputc)字符讀寫函數(shù)是以字符(字節(jié))為單位的讀寫函數(shù)。每次可從文件讀出或向文件寫入一個字符。L讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個字符函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從翻開的文件fp中讀取一個字符并送入ch中。對于fgetc函數(shù)的使用有以下幾點說明:1)返回值假設(shè)讀字符成功,帶回所讀的字符,失敗返回文件結(jié)束標志EOF(即-1)可用此來判斷讀入是否 成功。2)讀取字符的結(jié)果也
24、可以不向字符變量賦值,例如:fgetc(fp);但是讀出的字符不能保存。3)在文件內(nèi)部有一個位置指針。用來指向文件的當(dāng)前讀寫字節(jié)。在文件翻開時,該指針總是 指向文件的第一個字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個字節(jié)。因此可連 續(xù)屢次使用fgetc函數(shù),讀取多個字符。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回 事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是 不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向 后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設(shè)置的。2.寫字符函數(shù)fputcfputc函數(shù)的功能是把一個字符寫
25、入指定的文件中 函數(shù)調(diào)用的形式為:fputc(字符量,文件指針); 其中,待寫入的字符量可以是字符常量或變量 例如:fputc(a,fp);其意義是把字符a寫入fp所指向的文件中。對于fputc函數(shù)的使用也要說明幾點:1)被寫入的文件可以用寫、讀寫、追加方式翻開,用寫或讀寫方式翻開一個已存在的文件時 將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保存原有文件內(nèi)容,希望寫入的字 符以文件末開始存放,必須以追加方式翻開文件。被寫入的文件假設(shè)不存在,那么創(chuàng)立該文件。 2)每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。3)fputc函數(shù)有一個返回值,如寫入成功那么返回寫入的字符,否那么返回一個E
26、OFo可用此來 判斷寫入是否成功?!纠?0,1從鍵盤輸入一些字符,并逐個把它們送到磁盤上去,直到用戶輸入一個#時為止。 編寫程序:include include int main()FILE*fp ;char ch, filename1。;printf(“請輸入所用的文件名”);scanf( %sn , filename);getchar();if( (fp= fopen(filename, w) = = NULL)(printf( cannot open filen);exit(0) ; )printf(“請輸入一個準備存儲到磁盤的字符串(以#結(jié)束):“);后省略程序分析:(1) exit是
27、標準C的庫函數(shù),作用是使程序終止,用此函數(shù)時在程序的開頭應(yīng)包含stdlib. h頭文件。(2)用getchar函數(shù)接收用戶從鍵盤輸入的字符。注意每次只能接收一個字符。注意程序 第8行的作用:用scanf函數(shù)輸入文件名時,最后加了一個“回車”,它表示輸入的字符串 結(jié)束,它前面輸入的字符作為文件名,但是“回車符仍保存在緩沖區(qū)中。為了防止其后把 它作為有效數(shù)據(jù)讀取,用第8行的getchar函數(shù)把它讀取了,但并不賦給任何變量,只是把 回車符“消化” Jo2.怎樣向文件讀寫一個字符串(字符串讀寫函數(shù) fgets 和 fputs)L讀字符串函數(shù)fgets函數(shù)的功能是從指定的文件中讀一個字符串到字符數(shù)組中
28、函數(shù)調(diào)用的形式為:fgets(字符數(shù)組名n文件指針); 其中的n是一個正整數(shù)。對fgets函數(shù)有兩點說明:(1) fgets函數(shù)的函數(shù)原型為char * fgets (char * str, int n, FILE * fp);其作用是從文件讀入一個字符串。調(diào)用時可以寫成下面的形式: fgets(str,n,fp);其中,n是要求得到的字符個數(shù),但實際上只從fp所指向的文件中讀入n-1個字符,然后 在最后加一個0字符,這樣得到的字符串共有n個字符,把它們放到字符數(shù)組str中。如果在讀完n-1個字符之前遇到換行符“n”或文件結(jié)束符EOF,讀入即結(jié)束,但將所遇到 的換行符”仁也作為一個字符讀入(2
29、)假設(shè)執(zhí)行fgets函數(shù)成功,那么返回值為str數(shù)組首元素的地址,如果一開始就遇到文件尾 或讀數(shù)據(jù)出錯,那么返回NULL.2.寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串其調(diào)用形式為:fputs(字符串,文件指針);其中字符串可以是字符串常量、字符數(shù)組名或字符型指針,字符串末尾的0不輸出 例如:fputs( uabcd u,fp);其意義是把字符串“abed”寫入fp所指的文件之中。fputs函數(shù)的函數(shù)原型為int fputs (char * str, FILE * fp);其作用是將str所指向的字符串輸出到fp所指向的文件中。假設(shè)輸出成功,返回0;否那么返回非0值
30、補充說明:在向磁盤文件寫數(shù)據(jù)時,只輸出字符串中的有效字符,并不包括字符串結(jié)束標志0.這樣前 后兩次輸出的字符串之間無分隔,連成一片。當(dāng)以后從磁盤文件讀回數(shù)據(jù)時,就無法區(qū)分各 個字符串了。為了防止出現(xiàn)此情況,在輸出一個字符串后,人為地輸出一個 ,作為字 符串之間的分隔,fputs( “n,fp)。.用格式化的方式讀寫文本文件(格式化讀寫函數(shù)fscanf和fprintf)fscanf函數(shù),fprintf函數(shù)與前面使用的scant和printf函數(shù)的功能相似,都是格式化讀寫 函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤 文件。它們的一般調(diào)用方式為fpr
31、intf(文件指針格式字符串輸出表列);fscanf(文件指針格式字符串,輸入表列);例如:fprinlf (fp,n %d%6.2f1i,f);它的作用是將int型變量i和float型變量f的值按%d和%6. 2f的格式輸出到fp指向的文 件中。這是和輸出到屏幕的情況相似的,只是它沒有輸出到屏幕而是輸出到文件而已。同樣用以下fscanf函數(shù)可以從磁盤文件上讀入ASCII字符:fscanf (fp,%d,%f, &i,&f);磁盤文件上如果有字符“3,45 ,那么從磁盤文件中讀取整數(shù)3送給整型變量i,讀取實數(shù)4. 5 送給float型變量f。用fprint和fcanf函數(shù)對磁盤文件讀寫,使用方
32、便,容易理解,但由于在輸入時要將文件中 的ASCII碼轉(zhuǎn)換為二進制形式再保存在內(nèi)存變量中,在輸出時又要將內(nèi)存中的二進制形式轉(zhuǎn) 換成字符,要花費較多時間。.用二進制方式向文件讀寫一組數(shù)據(jù)(數(shù)據(jù)塊讀寫函數(shù) fread 和 fwtrite)在程序中不僅需要一次輸入輸出一個數(shù)據(jù),而且常常需要一次輸入輸出一組數(shù)據(jù)(如數(shù)組或 結(jié)構(gòu)體變量的值),C語言允許用fread函數(shù)從文件中讀一個數(shù)據(jù)塊,用fwrite函數(shù)向文件 寫一個數(shù)據(jù)塊。在讀寫時是以二進制形式進行的。在向磁盤寫數(shù)據(jù)時,直接將內(nèi)存中一組 數(shù)據(jù)原封不動、不加轉(zhuǎn)換地復(fù)制到磁盤文件上,在讀入時也是將磁盤文件中假設(shè)干字節(jié)的內(nèi) 容一批讀入內(nèi)存。它們的一般調(diào)用
33、形式為fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);其中:buffer :是一個地址。在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中, 它表示存放輸出數(shù)據(jù)的首地址。size :要讀寫的字節(jié)數(shù)。count :要讀寫多少個數(shù)據(jù)項(每個數(shù)據(jù)項長度為size)。fp : FILE類型指針。說明:(1) fread或fwrite函數(shù)的類型為int型,如果fread或fwrite函數(shù)執(zhí)行成功,那么函數(shù) 返回值為形參count的值(一個整數(shù)),即輸入或輸出數(shù)據(jù)項的個數(shù)(今為1)fread和fwrite函數(shù)用于二進制文件
34、的輸入輸出。因為它們是按數(shù)據(jù)塊的長度來處理輸 入輸出的,不出現(xiàn)字符轉(zhuǎn)換。在翻開文件時指定用二進制文件,這樣就可以用fread和fwrite函數(shù)讀寫任何類型的信息, 例如:fread (f,4,10,fp);其中,f是一個float型數(shù)組名(代表數(shù)組首元素地址)。這個函數(shù)從fp所指向的文件讀入10 個4個字節(jié)的數(shù)據(jù),存儲到數(shù)組f中。如果有一個Struct student_type結(jié)構(gòu)體類型:struct Student_typechar name10;int num ;int age;char addr30;stud40;定義了一個結(jié)構(gòu)體數(shù)組stud,有40個元素,每一個元素用來存放一個學(xué)生的數(shù)據(jù)(包括姓 名、學(xué)號、年齡、地址)。假設(shè)學(xué)生的數(shù)據(jù)已存放在磁盤文件中,可以用下面的for語句和 fread函數(shù)讀入40個學(xué)生的數(shù)據(jù):for (i=0 ; i40 ; i+ +)fread(&studi , sizeof (struct Student_type) , 1 , fp);執(zhí)行40次循環(huán),每次從fp指向的文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化纖產(chǎn)業(yè)的國際合作與競爭策略考核試卷
- 2025-2030年手機信號增強技術(shù)行業(yè)跨境出海戰(zhàn)略研究報告
- 2025-2030年按摩披肩加熱版行業(yè)跨境出海戰(zhàn)略研究報告
- 2025-2030年數(shù)控木工雕刻機升級行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 2025-2030年城市與監(jiān)測無人機行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 2025-2030年數(shù)據(jù)線保護套行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 2025-2030年在線教育書籍出版行業(yè)跨境出海戰(zhàn)略研究報告
- 2025-2030年增肌飲料行業(yè)跨境出海戰(zhàn)略研究報告
- 二零二五年度文化中心藝術(shù)導(dǎo)師聘用合同3篇
- 印刷業(yè)綠色印刷實施與評價考核試卷
- 鐵路路基工程施工組織設(shè)計方案
- 2025中國大唐集團內(nèi)蒙古分公司招聘高頻重點提升(共500題)附帶答案詳解
- 起重吊裝工程安全監(jiān)理細則模版(3篇)
- 充血性心力衰竭課件
- 《VAVE價值工程》課件
- 四川政采評審專家入庫考試基礎(chǔ)題復(fù)習(xí)試題及答案(一)
- 分享二手房中介公司的薪酬獎勵制度
- 安徽省2022年中考道德與法治真題試卷(含答案)
- GB 4793-2024測量、控制和實驗室用電氣設(shè)備安全技術(shù)規(guī)范
- 項目人員管理方案
- 重大火災(zāi)隱患判定方法
評論
0/150
提交評論