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