C語(yǔ)言中返回錯(cuò)誤信息的相關(guān)函數(shù)用法總結(jié)
C語(yǔ)言strerror()函數(shù):返回錯(cuò)誤原因的描述字符串
頭文件:
#include <string.h>
定義函數(shù):
char * strerror(int errnum);
函數(shù)說(shuō)明:strerror()用來(lái)依參數(shù)errnum 的錯(cuò)誤代碼來(lái)查詢(xún)其錯(cuò)誤原因的描述字符串, 然后將該字符串指針?lè)祷?
返回值:返回描述錯(cuò)誤原因的字符串指針.
范例:
/* 顯示錯(cuò)誤代碼0 至9 的錯(cuò)誤原因描述 */ #include <string.h> main() { int i; for(i = 0; i < 10; i++) printf("%d : %s\n", i, strerror(i)); }
執(zhí)行:
0 : Success 1 : Operation not permitted 2 : No such file or directory 3 : No such process 4 : Interrupted system call 5 : Input/output error 6 : Device not configured 7 : Argument list too long 8 : Exec format error 9 : Bad file descriptor
C語(yǔ)言perror()函數(shù):打印最近一次系統(tǒng)錯(cuò)誤信息
函數(shù)perror()用于拋出最近的一次系統(tǒng)錯(cuò)誤信息,其原型如下:
void perror(char *string);
【參數(shù)】string為要輸出的錯(cuò)誤信息。
說(shuō)明:perror()用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)錯(cuò)誤(stderr)。參數(shù)string所指的字符串會(huì)先打印出,后面再加上錯(cuò)誤原因字符串,此錯(cuò)誤原因依照全局變量errno 的值來(lái)決定要輸出的字符串。
在庫(kù)函數(shù)中有個(gè)errno變量,每個(gè)errno值對(duì)應(yīng)著以字符串表示的錯(cuò)誤類(lèi)型。當(dāng)你調(diào)用"某些"函數(shù)出錯(cuò)時(shí),該函數(shù)已經(jīng)重新設(shè)置了errno的值。perror函數(shù)只是將你輸入的一些信息和現(xiàn)在的errno所對(duì)應(yīng)的錯(cuò)誤一起輸出。
【實(shí)例】打開(kāi)一個(gè)不存在的文件并輸出錯(cuò)誤信息。
#include <stdio.h> #include <assert.h> #include <stdlib.h> int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" );/*打開(kāi)文件*/ assert( fp ); /*斷言不為空*/ fclose( fp );/*關(guān)閉*/ fp = fopen( "nulltest.txt", "r" );/*打開(kāi)一個(gè)不存在的文件*/ if ( NULL == fp ) { /*顯示最近一次錯(cuò)誤信息*/ perror("fopen( \"nulltest.txt\", \"r\" )"); } return 0; }
運(yùn)行結(jié)果:
fopen( "nulltest.txt", "r" ):No such file or directory
程序先定義一個(gè)文件指針fp,之后創(chuàng)建文件 test.txt,斷言文件打開(kāi)成功,然后關(guān)閉該文件,再以只讀的方式打開(kāi)文件nulltest.txt,判斷該文件指針是否問(wèn)空,如果為空則使用 perror() 輸出錯(cuò)誤信息。perror()用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因 輸出到標(biāo)準(zhǔn)設(shè)備(stderr)。函數(shù)參數(shù)string所指的字符串會(huì)先打印出, 后面再加上錯(cuò)誤原因字符串。此錯(cuò)誤原因依照全局變量error的值來(lái)決定要輸出的字符串。
如果連續(xù)調(diào)用perror,如下:
perror("1"); perror("2");
會(huì)出現(xiàn)以下結(jié)果:
1:success 2:Illegal seek
這種問(wèn)題出現(xiàn)的原因是:
perror()是通過(guò)lseek方法根據(jù)errorno查找對(duì)應(yīng)的錯(cuò)誤信息,然后輸出的。
在程序運(yùn)行的時(shí)候,errorno的初始值對(duì)應(yīng)的信息為:Success。只有程序中有錯(cuò)誤出現(xiàn)時(shí),才會(huì)改變給errorno。如果沒(méi)有錯(cuò)誤出現(xiàn),errorno的值是不會(huì)改變的。
但是perror方法是個(gè)例外,每次調(diào)用perror方法,都會(huì)首先輸出errorno對(duì)應(yīng)的信息,然后重置errorno為undefined,這時(shí)如果馬上在一次調(diào)用perror,perror中的lseek根據(jù)undefined去查找錯(cuò)誤信息,就會(huì)拋錯(cuò),錯(cuò)誤剛好被記錄在errorno中,因此,就把lseek的錯(cuò)誤打印出來(lái)了。所以第一次調(diào)用perror方法的時(shí)候會(huì)正常數(shù)據(jù)錯(cuò)誤信息,但是如果連續(xù)調(diào)用第二次,由于第一次的perror調(diào)用已經(jīng)把errorno設(shè)置成了undefined,所以連續(xù)的第二次,第三次...........第一億次調(diào)用都會(huì)輸出Illegal seek錯(cuò)誤。
C語(yǔ)言ferror()函數(shù):檢查文件流是否有錯(cuò)誤發(fā)生
頭文件:
#include <stdio.h>
定義函數(shù):
int ferror(FILE *stream);
函數(shù)說(shuō)明:ferror()用來(lái)檢查參數(shù)stream 所指定的文件流是否發(fā)生了錯(cuò)誤情況, 如有錯(cuò)誤發(fā)生則返回非0 值.
返回值:如果文件流有錯(cuò)誤發(fā)生則返回非0 值.
相關(guān)文章
C語(yǔ)言中如何獲取函數(shù)內(nèi)成員的值你知道嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中如何獲取函數(shù)內(nèi)成員的值的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03epoll多路復(fù)用的一個(gè)實(shí)例程序(C實(shí)現(xiàn))
這篇文章主要為大家詳細(xì)介紹了epoll多路復(fù)用的一個(gè)實(shí)例程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08基于C語(yǔ)言編寫(xiě)一個(gè)多功能計(jì)算器
這篇文章主要為大家詳細(xì)介紹了如何基于C語(yǔ)言編寫(xiě)一個(gè)多功能計(jì)算器,除了四則混合運(yùn)算之外,還支持三角函數(shù)和絕對(duì)值等函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08C++中Boost.Chrono時(shí)間庫(kù)的使用方法
chrono是一個(gè)time library, 源于boost,現(xiàn)在已經(jīng)是C++11標(biāo)準(zhǔn)了,下面這篇文章主要給大家介紹了關(guān)于C++中Boost.Chrono時(shí)間庫(kù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09