C語言基礎(檔案管理)

2021-09-12 03:57:04 字數 3865 閱讀 9282

乙個檔案,無論它是文字檔案還是二進位制檔案,都是代表了一系列的位元組。c 語言不僅提供了訪問頂層的函式,也提供了底層(os)呼叫來處理儲存裝置上的檔案

可以使用fopen( )函式來建立乙個新的檔案或者開啟乙個已有的檔案,這個呼叫會初始化型別file的乙個物件,型別file包含了所有用來控制流的必要的資訊。下面是這個函式呼叫的原型:

file *fopen( const char * filename, const char * mode );
在這裡,filename是字串,用來命名檔案,訪問模式mode的值可以是下列值中的乙個:

模式描述

r開啟乙個已有的文字檔案,允許讀取檔案。

w開啟乙個文字檔案,允許寫入檔案。如果檔案不存在,則會建立乙個新檔案。在這裡,您的程式會從檔案的開頭寫入內容。如果檔案存在,則該會被截斷為零長度,重新寫入

a開啟乙個文字檔案,以追加模式寫入檔案。如果檔案不存在,則會建立乙個新檔案。在這裡,您的程式會在已有的檔案內容中追加內容。

r+開啟乙個文字檔案,允許讀寫檔案。

w+開啟乙個文字檔案,允許讀寫檔案。如果檔案已存在,則檔案會被截斷為零長度,如果檔案不存在,則會建立乙個新檔案。

a+開啟乙個文字檔案,允許讀寫檔案。如果檔案不存在,則會建立乙個新檔案。讀取會從檔案的開頭開始,寫入則只能是追加模式。

如果處理的是二進位制檔案,則需使用下面的訪問模式來取代上面的訪問模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
為了關閉檔案,請使用 fclose( ) 函式。函式的原型如下:

int fclose( file *fp );
如果成功關閉檔案,fclose( )函式返回零,如果關閉檔案時發生錯誤,函式返回eof。這個函式實際上,會清空緩衝區中的資料,關閉檔案,並釋放用於該檔案的所有記憶體。eof 是乙個定義在標頭檔案stdio.h中的常量。

c 標準庫提供了各種函式來按字元或者以固定長度字串的形式讀寫檔案。

下面是把字元寫入到流中的最簡單的函式:

int fputc( int c, file *fp );
函式fputc()把引數 c 的字元值寫入到 fp 所指向的輸出流中。如果寫入成功,它會返回寫入的字元,如果發生錯誤,則會返回eof。您可以使用下面的函式來把乙個以 null 結尾的字串寫入到流中:

int fputs( const char *s, file *fp );
函式fputs()把字串s寫入到 fp 所指向的輸出流中。如果寫入成功,它會返回乙個非負值,如果發生錯誤,則會返回eof。您也可以使用int fprintf(file *fp,const char *format, ...)函式來寫把乙個字串寫入到檔案中。嘗試下面的例項:

注意:請確保您有可用的tmp目錄,如果不存在該目錄,則需要在您的計算機上先建立該目錄。

/tmp 一般是 linux 系統上的臨時目錄,如果你在 windows 系統上執行,則需要修改為本地環境中已存在的目錄,例如:c:\tmp、d:\tmp等。

#include int main()

當上面的**被編譯和執行時,它會在 /tmp 目錄中建立乙個新的檔案test.txt,並使用兩個不同的函式寫入兩行。接下來讓我們來讀取這個檔案。

下面是從檔案讀取單個字元的最簡單的函式:

int fgetc( file * fp );
fgetc()函式從 fp 所指向的輸入檔案中讀取乙個字元。返回值是讀取的字元,如果發生錯誤則返回eof。下面的函式允許您從流中讀取乙個字串:

char *fgets( char *buf, int n, file *fp );
函式fgets()從 fp 所指向的輸入流中讀取 n - 1 個字元。它會把讀取的字串複製到緩衝區buf,並在最後追加乙個null字元來終止字串。

如果這個函式在讀取最後乙個字元之前就遇到乙個換行符 '\n' 或檔案的末尾 eof,則只會返回讀取到的字元,包括換行符。您也可以使用int fscanf(file *fp, const char *format, ...)函式來從檔案中讀取字串,但是在遇到第乙個空格字元時,它會停止讀取。

#include int main()

1: this

2: is testing for fprintf...

3: this is testing for fputs..

首先,fscanf()方法只讀取了this,因為它在後邊遇到了乙個空格。其次,呼叫fgets()讀取剩餘的部分,直到行尾。最後,呼叫fgets()完整地讀取第二行。

下面兩個函式用於二進位制輸入和輸出:

size_t fread(void *ptr, size_t size_of_elements, 

size_t number_of_elements, file *a_file);

size_t fwrite(const void *ptr, size_t size_of_elements,

size_t number_of_elements, file *a_file);

這兩個函式都是用於儲存塊的讀寫 - 通常是陣列或結構體。

fseek 可以移動檔案指標到指定位置讀,或插入寫:

int fseek(file *stream, long offset, int whence);
fseek 設定當前讀寫點到 offset 處, whence 可以是 seek_set,seek_cur,seek_end 這些值決定是從檔案頭、當前點和檔案尾計算偏移量 offset。

你可以定義乙個檔案指標 file *fp,當你開啟乙個檔案時,檔案指標指向開頭,你要指到多少個位元組,只要控制偏移量就好,例如, 相對當前位置往後移動乙個位元組:fseek(fp,1,seek_cur); 中間的值就是偏移量。 如果你要往前移動乙個位元組,直接改為負值就可以:fseek(fp,-1,seek_cur)。

執行以下例項前,確保當前目錄下 test.txt 檔案已建立:

#include int main()   

fclose(fp);

}

執行結束後,開啟 test.txt 檔案:

this is teating for fprintf...
注意:只有用 r+ 模式開啟檔案才能插入內容,w 或 w+ 模式都會清空掉原來檔案的內容再來寫,a 或 a+ 模式即總會在檔案最尾新增內容,哪怕用 fseek() 移動了檔案指標位置。

C語言檔案管理

c語言檔案管理 1 哪些可以放在標頭檔案中,哪些不可以放在標頭檔案中 a 函式宣告可以放在標頭檔案中,函式定義 函式體 不可以放在標頭檔案中 例如 int find b 全域性變數宣告 extern 可以放在標頭檔案中,函式定義 函式體 不可以放在標頭檔案中 例如 extern struct sst...

C語言檔案基礎

指程式與資料的互動是以流的形式進行的。進行c語言檔案的訪問時,都會先進行 開啟檔案 操作,這個操作就是在開啟資料流,而 關閉檔案 操作就是關閉資料流。指在程式執行時,所提供的一塊儲存空間 在記憶體中 可用來暫時存放做準備執行的資料。它的設定是為了提高訪問效率,因為記憶體的訪問速度比磁碟驅動器快得多。...

c語言基礎 記憶體管理

1 malloc calloc 分配新的記憶體區域。calloc 在動態分配完記憶體後,自動初始化該記憶體空間為零,而 malloc 不初始化,裡邊資料是隨機的垃圾資料。2 realloc 調整已分配的記憶體區域。先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem address指向的位址,並...