C语言文件处理
聲明:本博客為參考他人博客和C語言書籍整理的,僅作為復(fù)習(xí)學(xué)習(xí)用,如有侵權(quán),本人可即刻刪除
1.文件與流
1.1文件
C語言中,文件是一個按順序組成的字節(jié)流。文件會以文件結(jié)束標(biāo)記(EOF)標(biāo)記文件的結(jié)束。
文件分為文本文件和二進(jìn)制文件兩種:
(1)文本文件是以字符編碼的方式進(jìn)行保存的。多是順序存取方式。順序讀取也就是從上往下,一筆一筆讀取文件的內(nèi)容。保存數(shù)據(jù)時,將數(shù)據(jù)附加在文件的末尾。這種存取方式常用于文本文件,而被存取的文件則稱為順序文件。擴展名為.txt的為文本文檔。
(2)二進(jìn)制文件適用于非字符為主的數(shù)據(jù)。如果以記事本打開,只會看到一堆亂碼,多為隨機存取方式。隨機存取方式多半以二進(jìn)制文件為主。它會以一個完整的單位來進(jìn)行數(shù)據(jù)的讀取和寫入,通常以結(jié)構(gòu)為單位。
其實,除了文本文件外,所有的數(shù)據(jù)都可以算是二進(jìn)制文件。二進(jìn)制文件的優(yōu)點在于存取速度快,占用空間小,以及可隨機存取數(shù)據(jù)。
1.2程序中的標(biāo)準(zhǔn)流
當(dāng)一個文件打開,就會有一個流與這個文件聯(lián)系在一起。當(dāng)文件執(zhí)行時,下面三個流被自動打開:
標(biāo)準(zhǔn)輸入:stdin,接收來自鍵盤的輸入。
標(biāo)準(zhǔn)輸出:stdout,將信息顯示在屏幕上。
標(biāo)準(zhǔn)錯誤:stdout,將出錯信息顯示在屏幕上。
每次打開一個文件都會返回一個指向FILE結(jié)構(gòu)體類型的指針,FIFLE結(jié)構(gòu)體類型包含了用于文件處理的信息。
2.文件操作函數(shù)
2.1文本文件操作
fopen(char* filename,*type) //如fopen("C:\\tmp\\test.text","w") /* 參數(shù): 參數(shù)filename是文件路徑及名稱,例如"c:\\tmp\\test.text"即代表c盤下tmp文件夾的test.txt文件注意轉(zhuǎn)義字符是兩個斜杠'\\','\'是控制字符 參數(shù)*type是使用文件的方式文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是: r(read):只讀 w(write):只寫 a(append):追加 t(text):文本文件,可省略不寫 b(binary):二進(jìn)制文件(1)用'r'打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件中讀出。'r' == 'rt' 打開一個文件,文件必須存在,只允許讀 'r+' == 'rt+' 打開一個文本文件,文件必須存在,允許讀寫(2)用'w'打開的文件,只能向該文件中寫入,若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。'w' == 'wt' 新建一個文本文件,已存在的文件將內(nèi)容清空,只允許寫 'w+' == 'wt+' 新建一個文本文件,已存在的文件將內(nèi)容清空,允許讀寫(3)若要向一個已存在的文件追加新的信息,用'a'方式打開文件,如果指定文件不存在,則嘗試創(chuàng)建該文件。'a' == 'at' 打開或新建一個文本文件,只允許在文件末尾追寫 'a+' == 'at+' 打開或新建一個文本文件,可以讀,但只允許 在文件末尾追寫fopen()失敗將會返回NULL */fclose(FILE* fp) /* 關(guān)閉打開的文件,關(guān)閉成功返回0,否則返回非0值 */fscanf(FILE* fp,...) /* 格式化讀取,從fp中格式化讀取數(shù)據(jù),與scanf相似 如fscanf(fp,"%s,%d",buff,&n)從fp中格式化讀取數(shù)據(jù)到buff和n中 */fprintf(FILE* fp,...) /* 格式化輸出,格式化輸出數(shù)據(jù)到fp中,與printf相似 如fprintf(FILE* fp,"%s,%d"buff,n)將buff和n格式化輸出到fp中 */fgetc(FILE* fd) //從目標(biāo)文件中讀入一個字符,例如fgetc(stdin)相當(dāng)于getchar(),從標(biāo)準(zhǔn)輸入中讀入一個字符fputc(const char* c,FILE* fd) //向文件中寫入一個字符,例如foutc('a',stdout)相當(dāng)于putchar('a'),將字符'a'寫入到標(biāo)準(zhǔn)輸出中fgets(char* str,int n,FILE* fp) /* 從文件中讀取n-1個字符,在最后設(shè)置'\0',放在str里面,所以放到str里n個字符,如果在讀完n-1個字符之前遇到換行符或者EOF,讀入結(jié)束。 */fputs(const char* str,FILE* fp) /* 向指定文件輸出一個字符串,str可以是字符串常量、字符數(shù)組名或字符型指針。若輸出成功,則返回0,否則返回EOF。 */rewind(FILE* fp) /* 使位置指針重返為位置的開頭 */ferror(FILE* fp) /* 調(diào)用各種函數(shù)(fread,fwrite,fgetc,fputc等)如果出現(xiàn)錯誤 ,可以用該函數(shù)檢查,出現(xiàn)錯誤返回 true。 注意對同一個函數(shù),每次調(diào)用輸入輸出函數(shù),均產(chǎn)生一個新的ferror函數(shù)值,所以應(yīng)當(dāng)在調(diào)用一個輸入輸出函數(shù)后,立刻檢查ferror函數(shù)的值,否則信息會丟失。在執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值會自動置為0。 */feof(FILE* fp) /* 用來檢查文件是否讀取結(jié)束,讀取結(jié)束返回true,反之返回false */2.2二進(jìn)制文件操作
fread(void* buff,size_t size,size_t count,FILE* stream) /* 如:fread(buff,sizeof(char),25,stream) 從輸入流中每個元素大小為sizeof(char),讀取25個元素到buff中 給定輸入流stream中,讀取最多count個元素到數(shù)組buff中,若出現(xiàn)錯誤,則流的文件位置指示器的位置不確定。若沒有完整的讀入最后一個元素,則其值不確定。參數(shù): buff,是指向接收數(shù)據(jù)的空間首地址的指針 size,讀取的每個元素的大小(單位是字節(jié)) count,要讀取的元素的個數(shù) stream:輸入流返回值: 返回成功讀取的元素的個數(shù),若出現(xiàn)錯誤或到達(dá)文件尾,則可能小于count。若size或count為0,則fread返回0且不進(jìn)行其他動作。fread不區(qū)分文件尾和錯誤。可以用ferror()檢測是否讀取錯誤,feof()檢測是否到達(dá)文件尾 */fwrite(const void* buff,size_t size,size_t count,FILE* stream) /* 參數(shù): buff:指針,要輸出數(shù)據(jù)的地址 size:要寫入的字節(jié)數(shù) count:要進(jìn)行寫入size字節(jié)的數(shù)據(jù)項的個數(shù) stream:目標(biāo)文件指針 */fseek(FILE* fp,long offset,int fromwhere) /* offset:移動的偏移量。如果為正數(shù),表示從fromwhere開始向文件尾方向移動。如果是負(fù)數(shù),表示從frommwhere開始向文件頭方向開始移動 start:起始點。用0、1、2代替。 #define SEEK_SET 0//文件開始 #define SEEK_CUR 1//文件當(dāng)前位置 #define SEEK_END 2//文件結(jié)尾 */ftell(FILE* fp) /* 用于得到文件位置指針當(dāng)前位置相對于文件首的偏移字節(jié)數(shù)。 */二進(jìn)制文件操作意思是函數(shù)以二進(jìn)制形式對文件進(jìn)行操作。
fwrite和fread可以用于文本文件的輸入輸出 。文本文件本質(zhì)上仍然是二進(jìn)制文件,僅僅是它保存的信息是些文本(比如 可顯示的ASCII碼,漢字等),這樣文本編輯器就可以用“文本方式”查看和編輯內(nèi)容,而不像二進(jìn)制那樣讓人看不懂。
3解決問題
3.1ftell函數(shù)的使用
參考博客點擊此處
3.2如求一個文件大小
#include<stdio.h>int main() {FILE* fp = NULL;fp = fopen("C:\\tmp\\test2.txt","r");fseek(fp, 0, 2);//將fp指針指向文件最后printf("%d\n", ftell(fp));//計算偏移量fclose(fp); }查看文件操作函數(shù)詳解博客請點擊此處
總結(jié)
- 上一篇: I/O复用函数的使用——poll
- 下一篇: define、const、typedef