柚子快報(bào)激活碼778899分享:開(kāi)發(fā)語(yǔ)言 C語(yǔ)言:文件處理
柚子快報(bào)激活碼778899分享:開(kāi)發(fā)語(yǔ)言 C語(yǔ)言:文件處理
文件處理
一、文件的類型(一)文本文件和二進(jìn)制文件
(二)程序文件和數(shù)據(jù)文件數(shù)據(jù)文件按照二進(jìn)制儲(chǔ)存
二、文件的打開(kāi)和關(guān)閉(一)文件指針(二)文件的打開(kāi)和關(guān)閉1、fopen2、fclose
(三)文件的打開(kāi)方式
三、文件讀寫函數(shù)(一)fgetc(二)fputc(三)fgets(四)fputs(五)fscanf(六)fprintf(七)fwrite(八)fread(九)sscanf(十)sprintf(十一)fseek(十二)ftell(十三)rewind
四、文件緩沖區(qū)結(jié)束語(yǔ)
一、文件的類型
(一)文本文件和二進(jìn)制文件
按照文本的組織信息來(lái)分,文件可以分成二進(jìn)制文件和文本文件
(二)程序文件和數(shù)據(jù)文件
按照文件功能來(lái)分,可以分成程序文件和數(shù)據(jù)文件
數(shù)據(jù)文件按照二進(jìn)制儲(chǔ)存
二、文件的打開(kāi)和關(guān)閉
(一)文件指針
每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名FILE.
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異。 每當(dāng)打開(kāi)一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)構(gòu)的變量,并填充其中的信息
(二)文件的打開(kāi)和關(guān)閉
1、fopen
FILE * fopen ( const char * filename, const char * mode );
用來(lái)打開(kāi)文件。打開(kāi)成功的同時(shí),函數(shù)會(huì)返回一個(gè)文件指針類型,相當(dāng)于文件和指針之間建立聯(lián)系。
int main() {
FILE* pf = fopen("test.txt", "w");
if (pf != NULL) {
fputs("man, what can i see", pf);
fclose(pf);
}
return 0;
}
可以觀察到我們的字符串已經(jīng)被寫入到了文件之中。
2、fclose
int fclose ( FILE * stream );
用來(lái)關(guān)閉文件,如果文件成功關(guān)閉,那么就會(huì)返回0,如果失敗,返回EOF;
(三)文件的打開(kāi)方式
文件使用方式 含義 如果指定文件不存在
“r”(只讀) 為了輸入數(shù)據(jù),打開(kāi)一個(gè)已經(jīng)存在的文本文件 出錯(cuò)
“w”(只寫) 為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件 新建文件
“a”(追加) 向文本文件尾添加數(shù)據(jù) 新建文件
“rb”(只讀) 為了輸入數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 出錯(cuò)
“wb”(只寫) 為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 新建文件
“ab”(追加) 向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù) 新建文件
“r+”(讀寫) 為了讀和寫,打開(kāi)一個(gè)文本文件 出錯(cuò)
“w+”(讀寫) 為了讀和寫,建議一個(gè)新的文件 新建文件
“a+”(讀寫) 打開(kāi)一個(gè)文件,在文件尾進(jìn)行讀寫 新建文件
“rb+”(讀寫) 為了讀和寫打開(kāi)一個(gè)二進(jìn)制文件 出錯(cuò)
“wb+”(讀寫) 為了讀和寫,新建一個(gè)新的二進(jìn)制文件 新建文件
“ab+”(讀寫) 打開(kāi)一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫 新建文件
三、文件讀寫函數(shù)
(一)fgetc
int fgetc ( FILE * stream );
成功 : 將返回字符讀?。ㄌ嵘秊?int 值)。 如果位置指示器位于文件末尾,則該函數(shù)返回 EOF 并設(shè)置流的 EOF 指示符 (feof)。
失敗 : 返回類型為 int 以適應(yīng)特殊值 EOF,該值表示失敗。 如果發(fā)生其他讀取錯(cuò)誤,該函數(shù)也會(huì)返回 EOF,但會(huì)設(shè)置其錯(cuò)誤指示器 (ferror)。
(二)fputc
int fputc ( int character, FILE * stream );
成功 : 將返回寫入的字符。 失敗 : 返回 EOF 并設(shè)置錯(cuò)誤指示器 (ferror).
(三)fgets
char * fgets ( char * str, int num, FILE * stream );
成功 : 如果讀取到字符該函數(shù)返回 str,如果一個(gè)都沒(méi)有讀取到,返回空指針。讀取字符時(shí)遇到文件末尾,設(shè)置 eof 指示(feof) 失敗 : 則設(shè)置錯(cuò)誤指示符 (ferror) 并返回空指針
(四)fputs
int fputs ( const char * str, FILE * stream );
成功 : 將返回一個(gè)非負(fù)值。 失敗 : 該函數(shù)返回 EOF 并設(shè)置錯(cuò)誤指示器 (ferror)。
(五)fscanf
int fscanf ( FILE * stream, const char * format, ... );
成功 : 該函數(shù)返回已成功填充的參數(shù)列表的項(xiàng)目數(shù)。讀取字符時(shí)遇到文件末尾,設(shè)置 eof 指示(feof) 失敗 : 該函數(shù)返回 EOF 并設(shè)置錯(cuò)誤指示器 (ferror)。 如果在解釋寬字符時(shí)發(fā)生編碼錯(cuò)誤,該函數(shù)會(huì)將 errno 設(shè)置為 EILSEQ。
(六)fprintf
int fprintf ( FILE * stream, const char * format, ... );
成功 : 將返回寫入的字符總數(shù)。 失敗 : 則設(shè)置錯(cuò)誤指示符 (ferror) 并返回負(fù)數(shù)。 如果在寫入寬字符時(shí)發(fā)生多字節(jié)字符編碼錯(cuò)誤,則將 errno 設(shè)置為 EILSEQ 并返回負(fù)數(shù)。
(七)fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
成功 : 返回成功寫入的元素總數(shù)。 失敗 : 如果此數(shù)字與 count 參數(shù)不同,則寫入錯(cuò)誤會(huì)阻止函數(shù)完成。在這種情況下,將為流設(shè)置錯(cuò)誤指示器 (ferror)。
(八)fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
成功 : 返回成功讀取的元素總數(shù)。 失敗 : 如果此數(shù)字與 count 參數(shù)不同,則表示讀取時(shí)發(fā)生讀取錯(cuò)誤或達(dá)到文件末尾。在這兩種情況下,都設(shè)置了正確的指示器,可以分別使用 ferror 和 feof 進(jìn)行檢查。
(九)sscanf
int sscanf ( const char * s, const char * format, ...);
成功 : 該函數(shù)返回已成功填充的參數(shù)列表中的項(xiàng)目數(shù)。 失敗 : 如果在成功解釋任何數(shù)據(jù)之前輸入失敗,返回 EOF。
(十)sprintf
成功 : 將返回寫入的字符總數(shù)。此計(jì)數(shù)不包括自動(dòng)附加在字符串末尾的附加 null 字符。 失敗 : 則返回一個(gè)負(fù)數(shù)。
(十一)fseek
定位文件指針
int fseek ( FILE * stream, long int offset, int origin );
成功 :該函數(shù)返回零。 失敗 :返回非零值。 如果發(fā)生讀寫錯(cuò)誤,則設(shè)置錯(cuò)誤指示器 (ferror)。
orgin可以取值:
(十二)ftell
求文件指針相對(duì)于起始位置的偏移量
long int ftell ( FILE * stream );
成功 : 將返回位置指示器的當(dāng)前值。 失敗 : 返回 -1,并將 errno 設(shè)置為系統(tǒng)特定的正值。
(十三)rewind
將文件指針指向文件的首地址,可以fseek來(lái)達(dá)到相同的作用
void rewind ( FILE * stream );
四、文件緩沖區(qū)
ANSIC 標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動(dòng)地在內(nèi)存中為程序中每一個(gè)正在使用的文件開(kāi)辟一塊“文件緩沖區(qū)”。從內(nèi)存向磁盤輸出數(shù)據(jù)會(huì)先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤上。如果從磁盤向計(jì)算機(jī)讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再?gòu)木彌_區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根據(jù)C編譯系統(tǒng)決定的。
結(jié)束語(yǔ)
相信有了這篇文件操作,下次再也不用擔(dān)心忘記重新學(xué)啦。親愛(ài)的小伙伴,不要忘記支持博主哦!
柚子快報(bào)激活碼778899分享:開(kāi)發(fā)語(yǔ)言 C語(yǔ)言:文件處理
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。