C語言:檔案讀寫
這是很基礎的教程,我只是寫給自己看,作為一個學習筆記記錄一下,如果正在閱讀的你覺得簡單,請不要批評,可以關掉選擇離開
如何學好一門程式語言
- 掌握基礎知識,為將來進一步學習打下良好的基礎。
- 上機實踐,通過大量的例題學習怎麼設計演算法,培養解題思路。
- 養成良好的編碼習慣,註釋一定要寫,要不然保你一週後自己寫的程式碼都不認識了
這篇部落格將介紹 C 程式 如何開啟、關閉、讀取和寫入文字檔案或二進位制檔案。一個檔案,無論它是文字檔案還是二進位制檔案,都是代表了一系列的位元組
開啟檔案
C語言中,使用fopen( )函式來建立一個新的檔案或者開啟一個已有的檔案,使用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
關閉後會清空緩衝區中的資料,並釋放用於該檔案的所有記憶體。所以應該養成開啟檔案記得關閉的習慣。
寫入檔案
函式fputc()把引數 c 的字元值寫入到 fp 所指向的輸出流中。
- 如果寫入成功,它會返回寫入的字元
- 如果發生錯誤,則會返回EOF
int fputc( int c, FILE *fp );
函式fputs()把字串s寫入到 fp 所指向的輸出流中。如果寫入成功,它會返回一個非負值,如果發生錯誤,則會返回EOF。
int fputs( const char *s, FILE *fp );
函式int fprintf(FILE *fp,const char *format, ...)把一個字串寫入到檔案中。
案例:
#include <stdio.h> int main() { FILE* fp = NULL; fp = fopen("./test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); }
上面的程式碼使用兩個不同的函式寫入兩行,它會在 當前目錄下建立一個test.txt 新檔案。
讀取檔案
fgetc()函式從 fp 所指向的輸入檔案中讀取一個字元。返回值是讀取的字元,如果發生錯誤則返回EOF。
int fgetc( FILE * fp );
fget() 函式允許從流中讀取一個字串(n-1個字元)。它會把讀取的字串複製到緩衝區buf,並在最後追加一個null字元來終止字串。
如果這個函式在讀取最後一個字元之前就遇到一個換行符 '\n' 或檔案的末尾 EOF,則只會返回讀取到的字元,包括換行符。
char *fgets( char *buf, int n, FILE *fp );
int fscanf(FILE *fp, const char *format, ...)函式來從檔案中讀取字串,但是在遇到第一個空格和換行符時,它會停止讀取。
舉例:
#include <stdio.h> int main(){ FILE* fp = NULL; char buff[255]; fp = fopen("./test.txt", "r"); fscanf(fp, "%s", buff); printf("1: %s\n", buff); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff); fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff); fclose(fp); }
1: This 2: is testing for fprintf... 3: This is testing for fputs...結果
首先,fscanf()方法只讀取了This,因為它在後邊遇到了一個空格。其次,呼叫fgets()讀取剩餘的部分,直到行尾。最後,呼叫fgets()完整地讀取第二行。
二進位制 I/O 函式
下面兩個函式用於二進位制輸入和輸出:
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);
這兩個函式都是用於儲存塊的讀寫 - 通常是陣列或結構體。