1. 程式人生 > 其它 >C語言:檔案讀寫

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);

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

參考

菜鳥教程