用於檔案的建立、開啟、關閉和刪除的函數:
- #include <stdio.h>
- FILE *fopen(const char *filename, const char *type);
- FILE *freopen(const char *filename, const char *type, FILE *stream);
- int fclose (FILE *__stream);
- int remove(const char *filename);
- int rename(const char *oldname, const char *newname);
fopen開啟或建立新檔案,返回指向該檔案流的FILE型指標(失敗返回NULL)。type的取值決定了檔案開啟檔案
開啟檔案參數
| r |
以唯讀開啟,若檔案不存在報錯 |
| w |
以唯寫開啟,若不存在就建立,否則清空內容 |
| a |
以追加方式開啟,若不存在就建立,否則在檔案尾端追加內容 |
| r+ |
以讀寫開啟,其他同r |
| w+ |
以讀寫開啟,其他同w |
| a+ |
讀取追加方式開啟,全文可讀,文末追加 |
| b+ |
以二進位模式開啟 |
a一般用於多個檔案同時寫入一個檔案的情況,w用於單進程寫
表准模板:
Code:
- if((fp = fopen("./tmp", "r")) == NULL) {
- printf("open file failed./n");
- return ;
- }
freopen用於實現檔案流的替換,返回指向新檔案的指標(失敗NULL)
例子:重新導向
Code:
- #include <stdio.h>
- #include <string.h>
-
- int main() {
- FILE* fp;
- char szBuf[100];
- /*將標準錯誤輸出重新導向到./tmp1*/
- if((fp = freopen("./tmp1", "w", stderr)) == NULL) {
- printf("stderr -- ./tmp1 failed./n");
- return ;
- }
- /*stderr已經重新導向,所有錯誤輸出都將寫入./tmp1檔案*/
- fputs("I like unix/linux.",stderr);
- /*關閉檔案*/
- fclose(fp);
- /*將標準輸入重新導向到./tmp1檔案*/
- if((fp = freopen("./tmp1", "r", stdin)) == NULL) {
- printf("stdin -- ./tmp1 failed./n");
- return ;
- }
- /*已經將標準輸入重新導向到./tmp1檔案,所有標準輸入來自該檔案*/
- memset(szBuf, 0, sizeof szBuf);
- fgets(szBuf, sizeof szBuf, stdin);
- printf("szBuf=[%s]/n", szBuf);
- fclose(fp);
- return 0;
- }
remove函數用於刪除檔案或者目錄,當然必須具備許可權才行。
reanme變更檔或者目錄的名字,注意:
如果原檔案名稱oldname代表檔案(非目錄),僅當newname不存在或者存在且非目錄才執行操作;
如果源檔案名稱代表目錄,僅當newname不存在或者為空白目錄才執行;
如果新舊檔案名稱相同,啥都不幹。
檔案的無格式讀寫
標準輸入輸出函數實現了緩衝處理。
字元輸入輸出函數
int getc(FILE *stream);
int getchar(void);
int fgetc(FILE *stream);
getc以unsigned char 讀入輸入資料流中的一個字元,轉換成整形後返回,並將指標移向下個字元處。
getchar實際是getc的宏定義getc(stdin)
fgetc的功能和getc類似,但速度遠低於getc
當檔案結束時,三個函數都返回EOF。需要注意的是這些函數的結果應該用int型資料來接收,否則可能會出錯。
int putc(int c, FILE *stream);
int putchar(int c);
int fputc(int c, FILE *stream);
類推上面的輸入函數,可知。
行讀寫:
char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);
int puts(const char *s);
int fputs(const char *s, FILE *stream);
puts會自動輸出/n。
塊讀寫:
size_t fread (void *ptr, size_t size, size_t nitems, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);
傳回值都為nitems的值。
fread從stream中讀入nitems個資料項目存到ptr所指向的記憶體中,每個資料項目大小為size個位元組。
size_t為unsigned int。
函數的變長參數:
在UNIX中,變長參數函數是通過va_list對象實現的,定義在stdarg.h中。
模板如下:
#include <stdarg.h>
function (parmN, ...)
va_list pvar;
.....................
va_start(pvar, parmN);
while()
{
..............
f = va_arg(pvar, type)
..............
}
va_end(pvar);
例子:
Code:
- #include <stdarg.h>
- int mysum(int i, ...) {
- int r = 0, j = 0;
- va_list pvar;
- va_start(pvar, i);
- for(j=0; j<i; j++) {
- r += va_arg(pvar, int);
- }
- va_end(pvar);
- }
-
- int main() {
- printf("%d", mysum(1,4));
- printf("%d", mysum(1,4,9));
- return 0;
- }