1.錯誤報告
perror函式以一種簡單、統一的方式報告錯誤。標準庫函式在乙個外部整型變數errno(在errno.h中定義)中儲存錯誤**之後把這個資訊傳遞給使用者程式,提示操作失敗的準確原因。perror函式簡化向使用者報告這些特點錯誤的過程。它的原型定義與stdio.h:
void perror(char const *message)
如果message不是null並且指向乙個非空的字串,perror函式就列印出這個字串,後面跟乙個分號和乙個空格,然後列印出一條用於解釋errno當前錯誤**的資訊。
注意:只有當乙個庫函式失敗時,errno才會被設定,當函式執行成功時,errno的值不會被修改,這意味著不能通過測試errno的值來判斷是否發生錯誤,反之,只有當被呼叫的函式提示有錯誤發生時檢查errno的值才有意義。
2.終止執行
exit函式用於終止乙個程式的執行,它的原型定義於stdlib.h,函式定義為:void exit(int status); status引數返回給作業系統,用於提示程式是否正常完成。
3.標準i/o函式庫
標準i/o函式庫具有一組i/o函式,實現了在原先的i/o庫基礎上許多程式設計師自行新增實現額外的功能;但這個函式存在兩個主要的缺陷:1)是否對不同平台具有普適性,不同機器、不同平台、不同架構可能存在差異;2)正是1)中的原因,對程式的可移植性就會降低。
4.i/o概念
1)流:所有i/o操作只是簡單地從程式移進或移出位元組,這種位元組流便稱為流。流分為兩種型別,文字流和二進位製流;
2)檔案:file是一種資料結構,用於訪問乙個流,執行時系統必須提供至少三個流:標準輸入、標準輸出、標準錯誤;
3)標準i/o常量:eof提示到達了檔案尾。
5.流i/o總覽
1)程式為必須同時處於活動狀態的每個檔案宣告乙個指標變數,其型別為file *;
2)流通過呼叫fopen函式開啟;
3)根據需要對該檔案進行讀取或寫入;
4)呼叫close函式關閉流。
標準流的i/o更為簡單,因為它們並不需要開啟或關閉。
6.開啟流
file *fopen(char const *name,char const *mode);
讀取 寫入 新增
文字 「r」 "w" "a"
二進位制 "rb" "wb" "ab"
7.關閉流
int fclose(file *f);
是否應該對fclose(或任何其他操作)進行錯誤檢查?首先問兩個問題:1)如果操作成功應該執行什麼?2)如果操作失敗應該執行什麼?若兩個問題答案是不同的,那麼你應該進行錯誤檢查,相同時跳過錯誤檢查才是合理的。
8.字元i/o
字元輸入由getchar函式家族執行,int fgetc(file *stream); int getc(file *stream); int getchar(void);
單個字元寫入到流中,可使用putchar函式家族,int fputc(int character,fiel *stream); int putc(int character,file *stream);int putchar(int character);
1)字元i/o巨集:fgetc和fputc都是真正的函式,getc、putc、getchar和putchar都是通過#define指令定義的巨集。
2)撤銷字元i/o:int ungetc(int character,file *stream);
9.未格式化的行i/o
char *fgetc(char *buffer,int buffer_size,file *stream);
char *gets(char *buffer);
int fputs(char const *buffer,file *stream);
int puts(char const *buffer);
10.格式化的行i/o
int fscanf(file *stream,char const *format,...);
int scanf(char const *format,...);
int sscanf(char const *string,char const *format,...);
int fprintf(file *stream,char const *format,...);
int printf(char const *format,...);
int sprintf(char const *string,char const *format,...);
11.二進位制i/o
size_t fread(void *buffer,size_t size,size_t count,file *stream);
size_t fwrite(void *buffer,size_t size,size_t count,file *stream);
12.重新整理和定位函式
int fflush(file *stream);
long ftell(file *stream);
int fseek(file *stream,long offset,int from);
void rewind(file *stream);
int fgetpos(file *stream,fpos_t *position);
int fsetpos(file *stream,fpos_t const *position);
13.改變緩衝方式
void setbuf(file *stream,char *buf);
int setvbuf(file *stream,char *buf,int mode,size_t size);
14.流錯誤函式
int feof(file *stream);
int ferror(file *stream);
void clearerr(file *stream);
15.臨時檔案
file *tmpfile(void);
char *tmpnam(char *name);
16.檔案操縱函式
int remove(char const *filename);
int rename(char const *oldname,char const *newname);
17.總結
file是一種資料結構,用於管理緩衝區和儲存流的i/o狀態;流用fopen函式開啟,它的引數是需要開啟的檔名和需要採用的流模式;逐字元的i/o由getchar和putchar函式家族實現;行i/o既可以格式化的,也可以是未格式化的;scanf和printf函式家族執行格式化的i/o操作;使用二進位製流寫入二進位制資料比使用字元i/o效率更高;在預設情況下,流是順序讀取的;在執行任何流操作之前,呼叫setbuf函式可以改變流所使用的快取區;ferror和clearerr函式和流的錯誤狀態有關;tmpfile函式返回乙個與乙個臨時檔案關聯的流。
18.警告的總結
1)忘了在一條除錯用的printf語句後面跟乙個fflush呼叫;
2)不檢查fopen函式的返回值;
3)改變檔案的位置將丟棄任何被退回到流的字元;
4)在使用fgets時指定太小的快取區;
5)使用gets的輸入溢位快取區且未被檢測到;
6)在使用任何scanf系列函式時,格式**和引數指標型別不匹配;
7)在任何scanf系列函式的每個非數值、非指標引數前忘加上&符號;
8)注意在使用scanf系列函式轉換double、long double、short和long整型時,在格式**中加入合適的限定符;
9)sprintf函式的輸出溢位了快取區且未檢測到;
10)混淆printf和scanf格式**;
11)使用任何printf系列函式時,格式**和引數型別不匹配;
12)在有些長整數長於普通整型的機器上列印長整型數值時,忘了在格式**中指定1修改字元;
13)使用自動數值作為流的快取區時應多加小心。
19.程式設計提示總結
1)在可能出現錯誤的場合,檢查並報告錯誤;
2)操作文字行而無需顧及它們的外部表示形式這個能力有助於提高程式的可移植性;
3)使用scanf限定符提高可移植性;
4)當你列印整數時,即使你所用的機器並不需要,堅持使用1修改符可以提高可移植性。
C和指標 學習筆記 第7章 函式
1.函式定義 函式的定義就是函式體的實現。函式體就是乙個 塊,它在函式被呼叫時執行。與函式定義相反,函式宣告出現在函式被呼叫的地方。函式宣告向編譯器提供該函式的相關資訊,用於確保函式被正確地呼叫。形式引數列表包括變數名和它們的型別宣告。塊包含了區域性變數的宣告和函式呼叫時需要執行的語句。2.函式宣告...
筆記《C和指標》第4章語句
語句 4.1 空語句 本身只包含乙個分號 4.2 表示式語句 表示式 分號 4.3 塊語句 位於一對花括號內的可選的宣告和語句列表 4.4 if 所有非零值 為真 4.5 while expression 先執行測試,再執行迴圈體 4.5.1 break 終止迴圈,執行下一句 迴圈正常結束後應執行的...
HTML和CSS學習筆記第15章 其他
返回主目錄 開發商特定css屬性 css變換和過渡 偽元素可以用來選擇元素的某些部分。例如first letter可以選擇乙個塊元素文字的第乙個字幕,這樣就能建立諸如首字母大寫或首字母下沉等效果。first line則能選擇段落第一行。語法與偽類相同 p first letter 根據屬性值選擇元素...