標準檔案編程庫(一)

來源:互聯網
上載者:User

用於檔案的建立、開啟、關閉和刪除的函數:

  1. #include <stdio.h>
  2. FILE *fopen(const char *filename, const char *type);
  3. FILE *freopen(const char *filename, const char *type, FILE *stream);
  4. int fclose (FILE *__stream);
  5. int remove(const char *filename);
  6. int rename(const char *oldname, const char *newname);

fopen開啟或建立新檔案,返回指向該檔案流的FILE型指標(失敗返回NULL)。type的取值決定了檔案開啟檔案

開啟檔案參數
r 以唯讀開啟,若檔案不存在報錯
w 以唯寫開啟,若不存在就建立,否則清空內容
a 以追加方式開啟,若不存在就建立,否則在檔案尾端追加內容
r+ 以讀寫開啟,其他同r
w+ 以讀寫開啟,其他同w
a+ 讀取追加方式開啟,全文可讀,文末追加
b+ 以二進位模式開啟

a一般用於多個檔案同時寫入一個檔案的情況,w用於單進程寫

表准模板:

Code:
  1. if((fp = fopen("./tmp", "r")) == NULL) {  
  2. printf("open file failed./n");  
  3. return ;  
  4. }  

freopen用於實現檔案流的替換,返回指向新檔案的指標(失敗NULL)

例子:重新導向

Code:
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main() {  
  5.   FILE* fp;  
  6.   char szBuf[100];  
  7.   /*將標準錯誤輸出重新導向到./tmp1*/  
  8.   if((fp = freopen("./tmp1", "w", stderr)) == NULL) {  
  9.     printf("stderr -- ./tmp1 failed./n");  
  10.     return ;  
  11.   }  
  12.   /*stderr已經重新導向,所有錯誤輸出都將寫入./tmp1檔案*/  
  13.   fputs("I like unix/linux.",stderr);  
  14.   /*關閉檔案*/  
  15.   fclose(fp);  
  16.   /*將標準輸入重新導向到./tmp1檔案*/  
  17.   if((fp = freopen("./tmp1", "r", stdin)) == NULL) {  
  18.     printf("stdin -- ./tmp1 failed./n");  
  19.     return ;  
  20.   }  
  21.   /*已經將標準輸入重新導向到./tmp1檔案,所有標準輸入來自該檔案*/  
  22.   memset(szBuf, 0, sizeof szBuf);  
  23.   fgets(szBuf, sizeof szBuf, stdin);  
  24.   printf("szBuf=[%s]/n", szBuf);  
  25.   fclose(fp);  
  26.   return 0;  
  27. }  

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:
  1. #include <stdarg.h>  
  2. int mysum(int i, ...) {  
  3.  int r = 0, j = 0;  
  4.  va_list pvar;  
  5.  va_start(pvar, i);  
  6.  for(j=0; j<i; j++) {  
  7.   r += va_arg(pvar, int);  
  8.  }  
  9.  va_end(pvar);  
  10. }  
  11.   
  12. int main() {  
  13.  printf("%d", mysum(1,4));  
  14.  printf("%d", mysum(1,4,9));  
  15.  return 0;  
  16. }  

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.