|     1、基本操作     1)打開文件     打(da)開(kai)文(wen)件有3個(ge)標準函數(shu),分(fen)別(bie)為fopen()、fdopen()和(he)(he)freopen()。它們可(ke)以不同的(de)(de)(de)(de)模式打(da)開(kai),但(dan)都返(fan)回一個(ge)指向FILE的(de)(de)(de)(de)指針,該指針指向對(dui)應的(de)(de)(de)(de)I/O流。此后(hou),對(dui)文(wen)件的(de)(de)(de)(de)讀寫都是通過這個(ge)FILE指針來進行的(de)(de)(de)(de)。其中,fopen()函數(shu)可(ke)以指定(ding)打(da)開(kai)文(wen)件的(de)(de)(de)(de)路徑和(he)(he)模式,fdopen()函數(shu)可(ke)以指定(ding)打(da)開(kai)的(de)(de)(de)(de)文(wen)件描述符和(he)(he)模式,而freopen()函數(shu)除可(ke)指定(ding)打(da)開(kai)的(de)(de)(de)(de)文(wen)件、模式外,還可(ke)指定(ding)特定(ding)的(de)(de)(de)(de)I/O流。     fopen()函數(shu)語(yu)法要點如表2.16所示。 表2.16  fopen()函數語法(fa)要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | FILE * fopen(const char * path, const char * mode) |  
    | 函數傳入值 | path:包含要打開的文件路徑及文件名 |  
    | mode:文件打開狀態,詳細信息參考表2.17 |  
    | 函數返回值 | 成功:指向FILE的指針 失敗:NULL
 |      其中(zhong),mode類似于open()函數中(zhong)的flag,可以定(ding)義打(da)開文件的訪問權限等,表2.17說明了fopen()中(zhong)mode的各種取值(zhi)。 表2.17  mode取值說明 
    
    | r或rb | 打開只讀文件,該文件必須存在 |  
    | r+或r+b | 打開可讀寫的文件,該文件必須存在 |  
    | w或wb | 打開只寫文件,若文件存在則文件長度清為0,即會擦寫文件以前的內容;若文件不存在則建立該文件 |  
    | w+或w+b | 打開可讀寫文件,若文件存在則文件長度清為0,即會擦寫文件以前的內容;若文件不存在則建立該文件 |  
    | a或ab | 以附加的方式打開只寫文件。若文件不存在,則會建立該文件;如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留 |  
    | a+或a+b | 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件;如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留 |      注意(yi):在每(mei)個選項中(zhong)加入b字符用來(lai)告訴函數庫打開的(de)文(wen)(wen)件(jian)為二(er)進(jin)制文(wen)(wen)件(jian),而非純文(wen)(wen)本文(wen)(wen)件(jian)。不過(guo)在Linux系(xi)統中(zhong)會自動識別不同類型的(de)文(wen)(wen)件(jian)而將此符號忽略。fdopen()函數語(yu)法要點(dian)如表2.18所示。 表2.18  fdopen()函數語法要(yao)點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | FILE * fdopen(int fd, const char * mode) |  
    | 函數傳入值 | fd:要打開的文件描述符 |  
    | mode:文件打開狀態,詳細信息參考表2.17 |  
    | 函數返回值 | 成功:指向FILE的指針 失敗:NULL
 |      freopen()函數語法(fa)要點如(ru)表2.19所示。 表2.19  freopen()函數語法要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | FILE * freopen(const char *path, const char * mode, FILE * stream) |  
    | 函數傳入值 | path:包含要打開的文件路徑及文件名 |  
    | mode:文件打開狀態,詳細信息參考表2.17 |  
    | stream:已打開的文件指針 |  
    | 函數返回值 | 成功:指向FILE的指針 失敗:NULL
 |      2)關閉文件(jian)     關閉標(biao)準流文件的函數(shu)為fclose(),該函數(shu)將緩沖區內的數(shu)據全部寫入(ru)到文件中,并釋放(fang)系統所提供的文件資源。fclose()函數(shu)語(yu)法要(yao)點如表2.20所示。 表(biao)2.20  fclose()函數語法要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int fclose(FILE * stream) |  
    | 函數傳入值 | stream:已打開的文件指針 |  
    | 函數返回值 | 成功:0 失敗:EOF
 |      3)讀文件     在文件流被打開后,可對文件流進(jin)行讀寫等操作(zuo),其中,讀操作(zuo)的函數(shu)為fread()。fread()函數(shu)語(yu)法要點(dian)如表2.21所(suo)示。 表(biao)2.21  fread()函數語法要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream) |  
    | 函數傳入值 | ptr:存放讀入記錄的緩沖區 |  
    | size:讀取的記錄大小 |  
    | nmemb:讀取的記錄數 |  
    | stream:要讀取的文件流 |  
    | 函數返回值 | 成功:返回實際讀取到的nmemb數目 失敗:EOF
 |      4)寫(xie)文件     fwrite()函數用于對指定的文件流(liu)進行寫操作。fwrite()函數語法要(yao)點如表(biao)2.22所示。 表2.22  fwrite()函數語法要(yao)點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | size_t fwrite(const void * ptr,size_t size, size_t nmemb, FILE * stream) |  
    | 函數傳入值 | ptr:存放寫入記錄的緩沖區 |  
    | size:寫入的記錄大小 |  
    | nmemb:寫入的記錄數 |  
    | stream:要寫入的文件流 |  
    | 函數返回值 | 成功:返回實際寫入到的nmemb數目 失敗:EOF
 |      2、基本操作     文件打開之后,根(gen)據(ju)一次讀寫文件中字符的數目可分(fen)為字符輸(shu)(shu)入/輸(shu)(shu)出(chu)、行輸(shu)(shu)入/輸(shu)(shu)出(chu)和(he)格式化輸(shu)(shu)入/輸(shu)(shu)出(chu),下面分(fen)別對這(zhe)3種不(bu)同的方式進(jin)行討論。     1)字(zi)符輸入/輸出(chu)     字(zi)符(fu)(fu)輸入(ru)/輸出(chu)函數一次(ci)僅讀寫一個字(zi)符(fu)(fu)。其中字(zi)符(fu)(fu)輸入(ru)/輸出(chu)函數的語法要點如(ru)表(biao)2.23和表(biao)2.24所示。 表(biao)2.23  字符(fu)輸入(ru)函數語法要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int getc(FILE * stream) int fgetc(FILE * stream)
 int getchar(void)
 |  
    | 函數傳入值 | stream:要輸入的文件流 |  
    | 函數返回值 | 成功:下一個字符 失敗:EOF
 |  表2.24  字符輸出函數(shu)語(yu)法要點(dian) 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int putc(int c, FILE * stream) int fputc(int c, FILE * stream)
 int putchar(int c)
 |  
    | 函數返回值 | 成功:字符c 失敗:EOF
 |      這(zhe)幾個函(han)數功能類(lei)似,其區別僅在(zai)于getc()和(he)putc()通常被實現為(wei)宏,而fgetc()和(he)fputc()不(bu)能實現為(wei)宏,因此,函(han)數的實現時間會有(you)所(suo)差(cha)別。     下面這個實例結合fputc()和fgetc(),將標準輸入復制到標準輸出中。     /*fput.c*/#include<stdio.h>
 main()
 {
 int c;
 /* 把fgetc()的結果作為fputc()的輸入 */
 fputc(fgetc(stdin), stdout);
 }
     運行結果如下(xia)所示:     $ ./fputw(用戶輸入)
 w(屏幕輸出)
     2)行(xing)輸入/輸出     行(xing)(xing)輸(shu)入/輸(shu)出函(han)數一(yi)次操作一(yi)行(xing)(xing),其(qi)中(zhong)行(xing)(xing)輸(shu)入/輸(shu)出函(han)數語法要點如表(biao)2.25和表(biao)2.26所示。 表2.25  行輸入函數語法(fa)要點 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | char * gets(char *s) char fgets(char * s, int size, FILE * stream)
 |  
    | 函數傳入值 | s:要輸入的字符串 size:輸入的字符串長度
 stream:對應的文件流
 |  
    | 函數返回值 | 成功:s 失敗:NULL
 |  表2.26  行輸出(chu)函數語法要點(dian) 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int puts(const char *s) int fputs(const char * s, FILE * stream)
 |  
    | 函數傳入值 | s:要輸出的字符串 stream:對應的文件流
 |  
    | 函數返回值 | 成功:s 失敗:NULL
 |      這里以gets()和puts()為例進(jin)行說明,本實例將標(biao)準輸入復制到標(biao)準輸出(chu)中(zhong),如下所示:     /*gets.c*/#include<stdio.h>
 main()
 {
 char s[80];
 fputs(fgets(s, 80, stdin), stdout);
 }
     運(yun)行(xing)該程序,結果如下所示:     $ ./getsThis is stdin(用戶輸入)
  This is stdin(屏(ping)幕輸出(chu))
     3)格式化輸(shu)入/輸(shu)出     格式(shi)化輸入(ru)/輸出函數可以指定輸入(ru)/輸出的具體格式(shi),這(zhe)里有讀(du)者已經非常熟悉的printf()、scanf()等函數,這(zhe)里簡要介紹一下它們(men)的格式(shi),如表(biao)2.27~表(biao)2.29所示(shi)。 表(biao)2.27  格式化輸出函數1 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int printf(const char *format,…) int fprintf(FILE *fp, const char *format,…)
 int sprintf(char *buf, const char *format,…)
 |  
    | 函數傳入值 | format:記錄輸出格式 fp:文件描述符
 buf:記錄輸出緩沖區
 |  
    | 函數返回值 | 成功:輸出字符數(sprintf返回存入數組中的字符數) 失敗:NULL
 |  表2.28  格(ge)式化(hua)輸(shu)出函(han)數2 
    
    | 所需頭文件 | #include <stdarg.h> #include <stdio.h>
 |  
    | 函數原型 | int vprintf(const char *format, va_list arg) int vfprintf(FILE *fp, const char *format, va_list arg)
 int vsprintf(char *buf, const char *format, va_list arg)
 |  
    | 函數傳入值 | format:記錄輸出格式 fp:文件描述符
 arg:相關命令參數
 |  
    | 函數返回值 | 成功:存入數組的字符數 失敗:NULL
 |  表2.29  格式化輸入函數 
    
    | 所需頭文件 | #include <stdio.h> |  
    | 函數原型 | int scanf(const char *format,…) int fscanf(FILE *fp, const char *format,…)
 int sscanf(char *buf, const char *format,…)
 |  
    | 函數傳入值 | format:記錄輸出格式 fp:文件描述符
 buf:記錄輸入緩沖區
 |  
    | 函數返回值 | 成功:輸出字符數(sprintf返回存入數組中的字符數) 失敗:NULL
 |      由于本節的函數(shu)用法比較簡單,并且常用,因此就不再舉例了,請讀者用到時(shi)自行查(cha)找其用法。     本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》    熱(re)點(dian)鏈接:     
         1、標準I/O操作的緩沖存儲類型2、Linux下多路復用I/O接口
 3、底層文件I/O操作的系統調用
 4、嵌入式Linux串口應用編程之串口讀寫
 5、嵌入式Linux串口應用編程之串口配置
 
 更多新聞>>  |