文件的讀寫操作
1、文件的打開
FILE *fopen( const char *filename, const char *mode );
filename:指向文件名字符串的常量指針,表明將要打開的文件
mode:文件打開模式,包括:
r --為讀取而打開,如果文件不存在或不能找到,函數調用失敗;
w --為寫入而打開一個空文件,如果文件已存在,內容將被清空;
a --為寫入而打開,如果文件已存在,則在文件尾部添加新數據,在寫入新的數據之前不會移除文件中已有的EOF標記;如果文件不存在,自動創建該文件;
r++ --打開文件用於寫入和讀取,文件必須已存在;
w++ --打開一個空文件用於寫入和讀取,如果該文件已存在,內容將被清空;
a++ --打開文件用於讀取和添加數據,在添加新數據之前會移除該文件中已有的EOF標記,添加寫入操作完成後再恢復EOF標記;如果文件不存在,自動創建該文件;
rb --以二進制方式打開,進行讀取操作
wb --以二進制方式打開一個空文件,執行寫入操作
2、文件的寫入
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
buffer:指向將要被寫入文件的數據;
size:以字節為單位的項的大小,size_t類型(即為unsigned integer類型);
註意:一個字符為1個字節(size=1),一個int型整數為4個字節(size=4)
count:將要被寫入的項的最大數目;
stream:指向FILE類型的指針,即fopen函數返回的指針;
/***file write***/ FILE *pFile = fopen("1.txt", "w"); fwrite("hello world!", 1, strlen("hello world!"), pFile); fwrite("你好,Autumn!", 1, strlen("你好,Autumn!"), pFile); fseek(pFile, 0, SEEK_SET); fwrite("watch", 1, strlen("watch"), pFile); fclose(pFile); //fflush(pFile);
3、文件的讀取
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer:指向存放數據的緩沖區的指針;
size:以字節為單位的項的大小;
count:將要讀取的項的最大數目;
stream:指向FILE類型的指針,即fopen函數返回的指針;
/***file read***/ //方法一: FILE *pFile = fopen("1.txt", "r"); char ch[100]; memset(ch, 0, 100); //將字符數組中的所有數據先都設置為0 fread(ch, 1, 100, pFile); fclose(pFile); MessageBox(ch); /* //方法二: FILE *pFile=fopen("1.txt","r"); char *pBuf; fseek(pFile,0,SEEK_END); //將文件指針移到文件的末尾 int len=ftell(pFile); //ftell返回文件指針當前的位置,即文件的長度 pBuf=new char[len+1]; //根據文件長度+“\0”分配內存 pBuf[len]=0; //索引從0開始,len的元素即為最後一個元素,對應“\0” rewind(pFile); //將文件指針重新放到文件的開頭 fread(pBuf,1,len,pFile); fclose(pFile); MessageBox(pBuf); */
4、文件的關閉
int fclose( FILE *stream );
stream:指向FILE類型的指針,即fopen函數返回的指針;
5、fflush函數
int fflush( FILE *stream );
stream:指向FILE類型的指針,即fopen函數返回的指針;
註:如果程序需要不斷多次的操作某一文件,就不能在每次操作之後先關閉文件再從緩沖文件系統中將數據寫入磁盤文件,此時就不能使用fclose函數,而應使用fflush函數來刷新緩沖區中的數據並將其寫入磁盤文件中;
6、文件指針
int fseek( FILE *stream, long offset, int origin );
stream:指向FILE類型的指針,即fopen函數返回的指針;
offset:設定偏移量;
origin:指定文件指針的起始位置,包括:
SEEK_CUR --從文件指針當前位置處開始
SEEK_END --從文件的末尾處開始
SEEK_SET --從文件的開頭處開始
void rewind( FILE *stream ); //將文件指針重新放置到文件的開頭處
stream:指向FILE類型的指針,即fopen函數返回的指針;
long ftell( FILE *stream ); //返回文件指針當前的位置
stream:指向FILE類型的指針,即fopen函數返回的指針;
7、文本文件、二進制文件---文本方式、二進制方式
7.1文件是計算機內存中以二進制表示的數據在外部存儲介質上的另一種存放形式,文本文件只是一種特殊形式的文件,它所存放的每一個字節都可以轉換為一個可讀的字符;但文件本身在存放數據時,實際是按照數據在內存中存放的方式來存放的,不會存放“a”、“b”這樣的字符,存放的都是它們的ASCII碼;
7.2若按照二進制方式向文件中寫入數據時,會將數據在內存中的存儲形式原樣輸出到文件中;
7.3寫入和讀取文件時要保持一致,如果采用文本方式寫入,應采用文本方式讀取;采用二進制方式寫入,應采用二進制方式讀取;
7.4不管文本文件還是二進制文件,如果統一采用二進制方式進行寫入和讀取,則是不會出錯的,因為這種讀取和寫入是嚴格按照一個字節一個字節進行的;
7.5不管是文本文件還是二進制文件,都可以采用二進制方式或文本方式打開,然後進行寫入或讀取;但是對於二進制文件,如果以文本方式讀取,則會出現問題;
思考題:
1、給出一個整數:98341,將該整數保存到文件中,要求在以記事本程序打開該文件時,顯示的是:98341;
思路:若將98341作為一個整數寫入到文本文件中,然後再打開文件是不能看到這個整數的,而是亂碼;應將98341轉換為5個字符依次寫入文本文件中,這樣打開文件時才能看到要顯示的數據;
//方法一: FILE *pFile=fopen("2.txt","w"); char ch[5]; ch[0]=9+48; //數字字符0對應的ASCII碼為48,9對應的ASCII碼則為9+48 ch[1]=8+48; ch[2]=3+48; ch[3]=4+48; ch[4]=1+48; fwrite(ch,1,5,pFile); fclose(pFile)
//方法二: FILE *pFile = fopen("2.txt", "w"); int i = 98341; char ch[5]; itoa(i, ch, 10); fwrite(ch, 1, 5, pFile); fclose(pFile);
2、給定一個字符串,既有數字字符又有英文字符,判斷哪些是數字字符;
思路:字符的ASCII碼值在48~57之間的,即為數字字符;
文件的讀寫操作