fopen小記

整理自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

_get_doserrno_set_doserrno

_errno

_get_errno_set_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位十六進制所代表的任意字符
二位十六進制
 
注意:區分,斜槓:"/" 與 反斜槓:"\" ,此處不可互換
 
所以,如果你的路徑是c:\demo\abc.txt ,你需要傳入參數_filename = c:\\demo\\abc.txt
 
複製代碼
 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 }
複製代碼

先整理這些,都是昨天遇到的問題,雖小卻有成長.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章