整理自https://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx
errno, _doserrno, _sys_errlist, and _sys_nerr
這些全局變量包含perror和strerror函數使用的錯誤代碼來打印錯誤消息。 應該使用下表中列出的更安全的功能版本代替它們的全局變量。
Global Variable | Functional Equivalents |
---|---|
_doserrno |
|
_errno |
These variables are declared in STDLIB.H as
extern int _doserrno;
extern int errno;
extern char *_sys_errlist[ ];
extern int _sys_nerr;
系統級調用中的錯誤設置了errno。因爲errno保留設置它的最後一次調用的值,所以該值可能會被後續調用所改變。始終在可能設置的呼叫之前和之後檢查errno。
在錯誤中,errno不一定設置爲與系統調用返回的錯誤代碼相同的值。對於I / O操作,請使用_doserrno訪問errno代碼的操作系統錯誤代碼。對於大多數非I / O操作,_doserrno的值未定義。
每個錯誤值都與可以使用perror打印或使用strerror存儲在字符串中的錯誤消息相關聯。 perror和strerror使用_sys_errlist數組和_sys_nerr(_sys_errlist中的元素數)來處理錯誤信息。
圖書館數學例程通過調用_matherr設置errno。爲了處理數學錯誤,請根據_matherr參考描述編寫自己的例程,並將其命名爲_matherr。
在ERRNO.H中定義爲預定義常量的所有errno值均與UNIX兼容,並在下面列出。只有ERANGE,EILSEQ和EDOM在ANSI標準中指定。
Constant | System error message | Value |
---|---|---|
EPERM |
Operation not permitted |
1 |
ENOENT |
No such file or directory |
2 |
ESRCH |
No such process |
3 |
EINTR |
Interrupted function |
4 |
EIO |
I/O error |
5 |
ENXIO |
No such device or address |
6 |
E2BIG |
Argument list too long |
7 |
ENOEXEC |
Exec format error |
8 |
EBADF |
Bad file number |
9 |
ECHILD |
No spawned processes |
10 |
EAGAIN |
No more processes or not enough memory or maximum nesting level reached |
11 |
ENOMEM |
Not enough memory |
12 |
EACCES |
Permission denied |
13 |
EFAULT |
Bad address |
14 |
EBUSY |
Device or resource busy |
16 |
EEXIST |
File exists |
17 |
EXDEV |
Cross-device link |
18 |
ENODEV |
No such device |
19 |
ENOTDIR |
Not a directory |
20 |
EISDIR |
Is a directory |
21 |
EINVAL |
Invalid argument |
22 |
ENFILE |
Too many files open in system |
23 |
EMFILE |
Too many open files |
24 |
ENOTTY |
Inappropriate I/O control operation |
25 |
EFBIG |
File too large |
27 |
ENOSPC |
No space left on device |
28 |
ESPIPE |
Invalid seek |
29 |
EROFS |
Read-only file system |
30 |
EMLINK |
Too many links |
31 |
EPIPE |
Broken pipe |
32 |
EDOM |
Math argument |
33 |
ERANGE |
Result too large |
34 |
EDEADLK |
Resource deadlock would occur |
36 |
EDEADLOCK |
Same as EDEADLK for compatibility with older Microsoft C versions |
36 |
ENAMETOOLONG |
Filename too long |
38 |
ENOLCK |
No locks available |
39 |
ENOSYS |
Function not supported |
40 |
ENOTEMPTY |
Directory not empty |
41 |
EILSEQ |
Illegal byte sequence |
42 |
STRUNCATE |
String was truncated |
80 |
備註:fopen有一個小坑,當然只對於初學者而言
fopen的方法定義是這樣的
FILE *fopen(const char * __restrict __filename, const char * __restrict __mode) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_2_0, __DARWIN_ALIAS(fopen));
fopen有兩個參數,一個是你要操作的文件名_filename,一個是你要做什麼操作_mode,mode沒有什麼好說的,filename這個參數,如果只傳你想操作的文件名,而你的文件是本地的,可能會因爲路徑問題,提示你找不到文件。error = 2(No such file or directory)沒有相關路徑或者沒有這個文件。
這個情況有兩種解決方案:
一種是本地利用w的mode自己去創建一個文件,針對這個文件去操作,可以保證這個文件是在你的當前目錄下的,不過這種不一定適用,比如我就是要讀一個字庫的bin文件,然後想將字庫文件中的Unicode字庫點陣轉成utf8,存到數組中,寫入文件。
第二種比較簡單,你可以嘗試一下絕對路徑,找到文件的絕對路徑,給到參數_filename就OK了,需要注意的是,路徑中一般都包含“\”字符,在C/C++語言中有轉譯字符這一說;
轉義字符
|
意義
|
ASCII碼值(十進制)
|
\a
|
響鈴(BEL)
|
007
|
\b
|
退格(BS) ,將當前位置移到前一列
|
008
|
\f
|
換頁(FF),將當前位置移到下頁開頭
|
012
|
\n
|
換行(LF) ,將當前位置移到下一行開頭
|
010
|
\r
|
回車(CR) ,將當前位置移到本行開頭
|
013
|
\t
|
水平製表(HT) (跳到下一個TAB位置)
|
009
|
\v
|
垂直製表(VT)
|
011
|
\\
|
代表一個反斜線字符''\'
|
092
|
\'
|
代表一個單引號(撇號)字符
|
039
|
\"
|
代表一個雙引號字符
|
034
|
\?
|
代表一個問號
|
063
|
\0
|
空字符(NULL)
|
000
|
\ooo
|
1到3位八進制數所代表的任意字符
|
三位八進制
|
\xhh
|
1到2位十六進制所代表的任意字符
|
二位十六進制
|
1 #include <iostream>
2 #include <fstream>
3
4 int main ()
5 {
6 std::cout << "hello world \n";
7
8 FILE *fp;
9 char *ch = "";
10 char buff[100];
11
12 errno_t err = fopen_s(&fp,"c:\\Users\\zhi\\Desktop\\abc.txt","r");
13
14 if(err == 0)
15 {
16 printf("the file open successful!");
17
18 ch = fgets(buff,100,fp);
19 printf("ch is :%s",ch);
20 fclose(fp);
21
22 }else{
23 printf("err:%d",err);
24 printf("the file open not OK!");
25 }
26 return 0;
27 }
先整理這些,都是昨天遇到的問題,雖小卻有成長.