1、打開和關閉文件
(1)打開文件:FILE * fopen(const char *filename, const char *mode)
在使用打開文件函數時,我們要提供一個要打開的文件名,這里要提供一個當前用戶有權限進行相應mode操作的文件,且應該提供相對應的文件路徑(默認路徑為當前文件夾)。打開方式mode有很多種,大概有如下幾種模式(參考自百度百科的參數介紹,因為我暫時看的這本書沒有詳細參數介紹,只給出了幾種,連接:http://baike.baidu.com/link?url=ZOtXcWvvy4pfUVm37V9GaHymKEKZKxIxMjeTcxSlTxKMcEmx1ZW_MiTH1myZUcG_):
r:以只讀方式打開文件,采用文本模式,文件必須存在;
rb:以只讀方式打開文件,采用二進制模式,文件必須存在;
r+:以可讀寫方式打開文件,采用文本格式,文件必須存在;
r+b:以可讀寫方式打開文件,采用二進制模式,文件必須存在;(codeblcoks環境使用GCC編譯器驗證,原百度百科未說明)
w:以只寫方式打開文件,采用文本模式,若文件存在則文件清零,若文件不存在則創立該文件;
wb:以只寫方式打開文件,采用二進制模式,同上;
w+:以讀寫方式打開文件,若文件存在則長度清零,若文件不存在則建立該文件。
w+b:以讀寫方式打開二進制文件,同上;
a:以附加方式打開文本文件,只可寫,若文件不存在則會創建文件;若文件存在,則會將新內容添加到文件末尾,原文件中內容保留;
ab:以附加方式打開二進制文件,同上;
a+:以附加方式打開可讀寫文本文件,同上;
a+b:以附加方式打開可讀寫二進制文件,同上;
rw+:以讀寫方式打開一個文本文件;
其中,r+的讀寫方式都在文件開頭,寫入操作會覆蓋之前的內容,而w+在文件存在時會創建新文件覆蓋之,再寫入內容,二a+是從文件末尾開始添加內容。
(2)關閉文件:int fclose (FILE* stream)
每個文件打開后都要注意在程序執行的所有可能路徑上關閉該文件,因為一個程序所能打開的文件數目是有限的,這點要注意!
2、fscanf和fprintf讀寫文件
函數原型如下:
int fscanf (FILE *stream, const char *format[, address, ...]);
int fprintf (FILE *stream, const char *format[, address, ...]);
兩個函數的用法類似C/C++中的scanf和printf,只不過所面向的流對象為文件流,同時,fscanf在讀到文件末尾時會返回EOF(End of file),是一個stdio.h中的內置常量。
3、fgetc和fputc讀寫文件
函數原型如下:
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
使用fgetc讀取為文件內容,每次僅讀取一個字節的文件,當讀到文件末尾時,會返回EOF值;
fputc會將一個字節的數據寫入文件,c是要寫入的數據,雖然是int型,但是只有低8位會被寫入文件,寫入失敗會返回EOF值。
4、fgets和fputs讀寫文件
函數原型如下:
char *fgets (char *s, int n, FILE *stream);
int fputs (const char*s, FILE *stream);
fgets每運行一次,會讀取一行數據,包括換行符,放入s中,並加上相應的結尾標志符‘\0’,參數n代表s中最多容納的字符數(不算‘\0’);而返回的指針和s指向同一內存區域,如果沒有數據可以讀取,則返回NULL;
fputs函數向文件流中寫入字符串s,但寫完s后並不會自動向文件中寫入換行符。
5、fread和fwrite讀寫文件
函數原型如下:
unsigned fread (void *ptr, unsigned size, unsigned n, FILE *stream);
unsigned fwrite (const void *ptr, unsigned size, unsigned n, FILE *stream);
fread 函數從文件中讀取n個大小為size字節的數據塊,放入ptr開始的內存中,返回值為讀取的字節數,若一個字節也未讀取,返回值為0;
fwrite函數將從地址ptr開始的n*size個字節的內容寫入到文件中,返回值表示成功寫入的字節數。
需要注意的一點就是,fread和fwrite函數讀寫文件,文件必須用二進制方式打開。
6、fseek改變文件當前位置
函數原型如下:
int fseek (FILE *stream, long offset, int whence);
作用:函數將與stream關聯的文件的“當前位置”設為距whence處offset字節的地方。whence可以有一下三種取值:
SEEK_SET:文件開頭;
SEEK_CUR:執行本函數前文件的當前位置;
SEEK_END:文件末尾;
例如:
fseek(fp, 200, SEEK_SET);// 將文件當前位置設為距離文件開始位置為200個字節處
程序示例:
fread (aStu, sizeof (Student), 7, fpSrc); // 讀取7*sizeof(Student)字節大小數據
fseek (fpSrc, sizeof (Student) * 20, SEEK_SET); // 將文件當前位置設為距離開始位置為sizeof(Student)*20個字節處
今天先寫到這,還看了一個設計模式和兩道簡單的ACM題目,有時間會放到博客!