1. 程式人生 > >《C程序設計語言》筆記 (十五) 參考手冊7

《C程序設計語言》筆記 (十五) 參考手冊7

ctype har pfile lib type 文件名 一次 錯誤處理函數 自動刪除

標準庫

ANSI定義的標準函數庫

標準庫不是C語言本身的構成部分

但是支持標準C的實現會提供該函數庫中的函數聲明、類型以及宏定義

標準庫中的函數 類型以及宏分別在下面的標準頭文件中定義:

<assert.h>

<ctype.h>

<errno.h>

<float.h>

<limits.h>

<locale.h>

<math.h>

<setjmp.h>

<signal.h>

<stdarg.h>

<stddef.h>

<stdio.h>

<stdlib.h>

<string.h>

<time.h>

可以通過下列方式訪問頭文件

#include <頭文件>

頭文件的包含順序是任意的,並可以包含任意多次

頭文件必須包含在任何外部聲明或定義之外

必須在使用頭文件中的任意聲明之前包含頭文件

頭文件不一定是源文件

以下劃線開頭的外部標識符保留給標準庫使用

  

輸入輸出<stdio.h>

頭文件<stdio.h>中定義的輸入輸出函數、類型以及宏的數目幾乎占整個標準庫的三分之一

流是與磁盤或其他外圍設備關聯的數據的源或目的地

盡管在某些系統中(如UNIX),文本流和二進制流是相同的,但標準庫任然提供了這兩種類型的流

文本流是由文本行組成的序列,每一行包含0個或多個字符並以‘\n‘結尾

二進制流是由未經處理的字節構成的序列,這些字節記錄著內部數據

如果在同一系統中寫入二進制流,然後再讀取二進制流,則讀出和寫入的內容完全相同

打開一個流,將把該流和一個文件或設備連接起來,關閉流將斷開連接

打開一個文件將返回一個指向FILE類型的對象的指針,該指針記錄了控制該流的所有必要信息

程序開始執行時,stdin stdout 和stderr這3個流已經處於打開狀態

文件操作

FILE *fopen(const char *filename,const char *mode);

fopen函數打開filename指定的文件,並返回一個與之關聯的流

如果打開失敗,則返回NULL

訪問模式:

"r"  讀

"w" 寫,並刪除已存在的內容

"a"  追加

"r+"  打開文本文件用於更新

"w+"  創建文本用於更新

"a+"  打開或創建文件用於更新,寫文件時追加到文件末尾

FILE *freopen(const char *filename,const char *mode,FILE *stream);

以mode指定的模式打開filename指定的文件,並將該文件關聯到stream指定的流


成功返回stream,出錯返回NULL 

freopen 函數一般用於改變與stdin stdout stderr相關聯的文件


int fflush(FILE *stream);

對輸出流來說,fflush函數將已寫到緩沖區但尚未寫入文件的所有數據寫入文件

對輸入流來說,其結果是未定義的

如果在寫的過程中方式錯誤,則返回EOF 否則返回0

fflush(NULL)  將清洗所有的輸出流


int flose(FILE *stream);
將所有未寫入的數據寫入stream中,丟棄緩沖區的所有未讀輸入數據,釋放自動分配的全部緩沖區,最後關閉流

若出錯返回EOF,否則返回0

  

int remove(const char *filename);

刪除指定的文件,如果刪除失敗,返回一個非0值.


int rename(const char *oldname,const char *newname);
修改文件名,失敗返回非0;

FILE *tmpfile(void);

tmpfile函數以模式"wb+"創建一個臨時文件,該文件在被關閉或程序正常結束時自動刪除


char *tmenam(char s[L_tmpname]);

tmpnam(NULL) 函數創建一個與現有文件名不同的字符串,並返回一個指向一內部靜態數組的指針


int setvbuf(FILE *stream,char *buf,int mode, size_t size);

setvbuf函數控制流stream的緩沖.

在執行讀寫以及其他任何操作之前必須調用此函數


void setbuf(FILE *stream,char *buf);

如果buf值為NULL,則關閉stream的緩沖

  

格式化輸出

printf函數提供格式化輸出轉換

int fprintf(FILE *stream,const char *format,...);

fprintf函數按照format說明的格式對輸出進行轉換,並寫到stream中。

返回實際寫入的字符數,錯誤返回負值


int sprintf(char *s,const char *format,...);

sprintf函數和printf函數基本相同,但其輸出將被寫入到字符串 s中,並以‘\0‘結束


vprintf

vfprintf

vsprintf

函數分別對應printf的函數等價

  

格式化輸入

scanf函數處理格式化輸入轉換

int fscanf(FILE *stream,const char *format,...);

fscanf函數根據格式字符串format從流stream中讀取輸入,並把轉換後的值賦值給後續參數,其中每個參數必須是一個指針

int sscanf(const char *s,const char *format,...);

sscanf函數scanf等價,所不同的是,前者的輸入字符來源於字符串s

  

字符輸入/輸出函數

int fgetc(FILE *stream);

函數返回stream流的下一個字符,返回類型unsigned char

如果達到文件末尾或發生錯誤,返回EOF


char *fgets(char *s,int n,FILE *stream);

fgets 函數最多將n-1個字符讀入到數組s中

當遇到換行符時,把換行符讀入到數組s中,讀取過程終止

數組以‘\0‘結尾

到達文件尾或發生錯誤,返回EOF


int fputc(int c,FILE *stream);

fputc函數把字符c輸出到stream中

返回寫入的字符,出錯返回EOF

int fputs(const char *s,FILE *stream);

fputs函數把字符串s輸出到stream中,出錯返回EOF


int getc(FILE *stream);
getc函數等價於fgetc,所不同的是,當getc函數定義為宏時,它可能多次計算stream的值


int getchar(void);
等價於getc(stdin);

char *gets(char *s);
把下一個輸入行讀入的數組中

int putc(int c ,FILE *stream);


int putchar(int c);

等價於 putc(c,stdout);


int puts(const char *s);

int ungetc(int c,FILE *stream);

  

直接輸入/輸出函數

size_t fread(void *ptr,size_t size,size_t nobj,FILE *stream);


size_t fwrite(const void *ptr,size_t size,size_t nobj,FILE *stream);

  

文件定位函數

int fseek(FILE *stream,long offset,int origin);

long ftell(FILE *stream);


void rewind(FILE *stream);

int fgetpos(FILE *stream,fpos_t *ptr);

int fsetpos(FILE *stream,const fpos_t *ptr);

  

錯誤處理函數

當發生錯誤或到達文件末尾時,標準庫中的許多函數都會設置狀態指示符

這些狀態指示符可被顯式的設置和測試

另外,整型表達式errno可以包含一個錯誤編號,據此可以進一步了解最近一次出錯信息

void clearerr(FILE *stream);

clearerr函數清除與流stream相關的文件結束符合錯誤指示符

int feof(FILE *stream);

如果設置了與stream流相關的文件結束符,feof函數將返回非0值

int ferror(FILE *stream);

void perror(const char *s);



fprintf(stderr,"%s,:%s\n",s"error message");

  

《C程序設計語言》筆記 (十五) 參考手冊7