目录
文件特性常量
文件常量
堆常量
EOF, WEOF
errno 常量
数学常量
数学错误常量
转换模式常量
文件读/写访问常量
NULL (CRT)
stdin, stdout, stderr
文件特性常量
语法
#include <io.h>
备注
这些常量指定由函数指定的文件或目录的当前特性。
特性可以通过以下清单常量表示:
返回的常量 | 说明 |
---|---|
_A_ARCH | 存档。 每当通过 BACKUP 命令更改或清除文件时进行设置。 值:0x20 |
_A_HIDDEN | 隐藏文件。 使用 DIR 命令时通常不可见,除非使用 /AH 选项。 返回有关具有此属性的普通文件和文件的信息。 值:0x02 |
_A_NORMAL | 正常。 可以不受限制地读取或写入的文件。 值:0x00 |
_A_RDONLY | 只读。 无法打开文件进行写入,并且无法创建同名的文件。 值:0x01 |
_A_SUBDIR | 子目录。 值:0x10 |
_A_SYSTEM | 系统文件。 使用 DIR 命令时通常不可见,除非使用 /AS 选项。 值:0x04 |
可使用 OR 运算符 (|
) 组合多个常量。
文件常量
语法
#include <fcntl.h>
备注
由这些常量中的一个或多个常量构成的整数表达式确定允许进行的读取或写入操作的类型。 它由将一个或多个常量与翻译模式常量组合在一起形成。
文件常量如下所示:
返回的常量 | 说明 |
---|---|
_O_APPEND | 在每次执行写入操作前,将文件指针重新定位到文件尾。 |
_O_CREAT | 创建并打开用于写入的新文件;如果存在 filename 文件,则常量无效。 |
_O_EXCL | 如果由 filename 指定的文件存在,则返回一个错误值。 仅在与 _O_CREAT 一起使用时适用。 |
_O_RDONLY | 打开文件以仅读取;如果提供此标志, _O_RDWR 则 _O_WRONLY 无法提供。 |
_O_RDWR | 打开用于读取和写入的文件;如果提供此标志, _O_RDONLY 则 _O_WRONLY 无法提供。 |
_O_TRUNC | 打开现有文件并将其截断为零长度;此文件必须具有写入权限。 销毁此文件的内容。 如果给定此标志,则无法指定 _O_RDONLY 。 |
_O_WRONLY | 仅打开用于写入的文件;如果提供此标志, _O_RDONLY 则 _O_RDWR 无法提供。 |
堆常量
语法
#include <malloc.h>
备注
这些常量提供表示堆状态的返回值。
返回的常量 | 含义 |
---|---|
_HEAPBADBEGIN | 找不到初始标头信息或无效。 |
_HEAPBADNODE | 找到错误节点,或堆已损坏。 |
_HEAPBADPTR | _pentry _HEAPINFO 结构字段不包含指向堆的有效指针, (_heapwalk 例程仅) 。 |
_HEAPEMPTY | 堆尚未初始化。 |
_HEAPEND | 已成功到达堆的结尾处(仅限 _heapwalk 例程)。 |
_HEAPOK | 堆是一致的(仅限 _heapset 和 _heapchk 例程)。 到目前为止没有错误; _HEAPINFO 结构仅包含有关下一个条目 (_heapwalk 例程的信息) 。 |
EOF
, WEOF
语法
#include <stdio.h>
备注
EOF
当文件结束 (或在某些情况下,遇到错误) 时,I/O 例程将返回。
WEOF
生成返回值(类型)wint_t
用于向宽流末尾发出信号,或报告错误条件。
errno
常量
语法
#include <errno.h>
备注
常 errno
量是针对 errno 各种错误条件分配给的值。
ERRNO.H
包含 errno
值的定义。 但是,并非 ERRNO.H
中给定的提供定义都可用于 32 位 Windows 操作系统。 ERRNO.H
中的某些值的存在是为了保持与 UNIX 系列操作系统的兼容性。 32 位 Windows 操作系统中的 errno
值是 XENIX 系统中的 errno
值的子集。
errno
值不一定与由从 Windows 操作系统进行的系统调用返回的实际错误代码相同。 若要访问实际操作系统错误代码,请使用包含此值的 _doserrno 变量。
支持以下 errno
值:
返回的常量 | 说明 | 值 |
---|---|---|
E2BIG | 自变量列表太长。 | 7 |
EACCES | 权限被拒绝。 文件的权限设置不允许指定访问。 尝试访问文件 (,在某些情况下,目录) 与文件的属性不兼容。 例如,尝试从未打开的文件读取时,可能会发生错误。 或者,尝试打开现有只读文件进行写入,或打开目录而不是文件。 在 MS-DOS 操作系统版本 3.0 以及更高版本下, EACCES 也可能表示锁定或共享冲突。在尝试重命名文件或目录或者删除现有目录时也可能发生错误。 | 13 |
EAGAIN | 没有更多进程、没有足够内存或达到最大嵌套级别。 尝试创建新进程失败,因为没有更多的进程槽,或者没有足够的内存,或者达到最大嵌套级别。 | 11 |
EBADF | 文件编号错误。 有两个可能的原因:1) 指定的文件描述符不是有效值或未引用打开的文件。 2) 尝试写入到已打开进行只读访问的文件或设备。 | 9 |
EBUSY | 设备或资源忙碌。 | 16 |
ECHILD | 没有生成的进程。 | 10 |
EDEADLK | 将会发生资源死锁。 | 36 |
EDEADLOCK | 与 EDEADLK 相同,以便与早期的 Microsoft C 版本兼容。 | 36 |
EDOM | 数学自变量。 数学函数的参数不在函数的域中。 | 33 |
EEXIST | 存在文件。 尝试创建已存在的文件。 例如,在 _open 调用中指定 _O_CREAT 和 _O_EXCL 标志,但命名的文件已存在。 | 17 |
EFAULT | 地址错误。 | 14 |
EFBIG | 文件太大。 | 27 |
EILSEQ | 非法字节序列(例如,在 MBCS 字符串中)。 | 42 |
EINTR | 函数中断。 | 4 |
EINVAL | 无效的参数。 为某个函数的自变量之一给定了无效值。 例如,当通过调用 fseek ) 将文件指针定位到源时给定的值位于文件开头之前 (。 | 22 |
EIO | I/O 错误。 | 5 |
EISDIR | 是目录。 | 21 |
EMFILE | 打开的文件太多。 没有更多文件说明符可用,因此无法打开更多文件。 | 24 |
EMLINK | 链接太多。 | 31 |
ENAMETOOLONG | 文件名太长。 | 38 |
ENFILE | 系统中打开的文件太多。 | 23 |
ENODEV | 没有此设备。 | 19 |
ENOENT | 没有此文件或目录。 指定的文件或目录不存在或找不到。 每当指定的文件不存在或路径的组件未指定现有目录时,可能会发生此消息。 | 2 |
ENOEXEC | 执行格式错误。 尝试执行无效的可执行文件或具有无效可执行文件格式的文件。 | 8 |
ENOLCK | 无可用锁。 | 39 |
ENOMEM | 无法为尝试的运算符提供足够的内存。 例如,当内存不足可用于执行子进程或无法满足调用中的 _getcwd 分配请求时,可能会出现此消息。 | 12 |
ENOSPC | 设备上没有剩余空间。 设备上没有可供写入的其他空间(例如,当磁盘已满时)。 | 28 |
ENOSYS | 功能不受支持。 | 40 |
ENOTDIR | 不是目录。 | 20 |
ENOTEMPTY | 目录不为空。 | 41 |
ENOTTY | 不适当的 I/O 控制操作。 | 25 |
ENXIO | 没有此设备或地址。 | 6 |
EPERM | 不允许执行该操作。 | 1 |
EPIPE | 管道损坏。 | 32 |
ERANGE | 结果太大。 数学函数的自变量太大,造成结果中的有效位部分或全部丢失。 当参数大于预期值时(例如,当 _getcwd 的 buffer 参数大于预期值时),在其他函数中也可能发生此错误。 | 34 |
EROFS | 只读文件系统。 | 30 |
ESPIPE | 搜寻无效。 | 29 |
ESRCH | 没有此进程。 | 3 |
EXDEV | 跨设备链接。 尝试将文件移至不同的设备(使用 rename 函数)。 | 18 |
STRUNCATE | 字符串复制或串联导致字符串被截断。 请参阅 _TRUNCATE。 | 80 |
下列值支持 POSIX 的兼容性:
返回的常量 | 说明 | 值 |
---|---|---|
EADDRINUSE | 正在使用的地址。 | 100 |
EADDRNOTAVAIL | 地址不可用。 | 101 |
EAFNOSUPPORT | 地址系列不受支持。 | 102 |
EALREADY | 连接已经进行。 | 103 |
EBADMSG | 错误消息。 | 104 |
ECANCELED | 操作已取消。 | 105 |
ECONNABORTED | 连接已中止。 | 106 |
ECONNREFUSED | 连接被拒绝。 | 107 |
ECONNRESET | 连接重置。 | 108 |
EDESTADDRREQ | 需要目标地址。 | 109 |
EHOSTUNREACH | 无法访问主机。 | 110 |
EIDRM | 已删除标识符。 | 111 |
EINPROGRESS | 操作正在进行。 | 112 |
EISCONN | 已连接。 | 113 |
ELOOP | 符号链接级别过多。 | 114 |
EMSGSIZE | 消息大小。 | 115 |
ENETDOWN | 网络中断。 | 116 |
ENETRESET | 网络重置。 | 117 |
ENETUNREACH | 无法访问网络。 | 118 |
ENOBUFS | 无缓冲空间。 | 119 |
ENODATA | 无可用消息。 | 120 |
ENOLINK | 无链接。 | 121 |
ENOMSG | 无消息。 | 122 |
ENOPROTOOPT | 无协议选项。 | 123 |
ENOSR | 无流资源。 | 124 |
ENOSTR | 不是流。 | 125 |
ENOTCONN | 未连接。 | 126 |
ENOTRECOVERABLE | 状态不可恢复。 | 127 |
ENOTSOCK | 不是套接字。 | 128 |
ENOTSUP | 不支持。 | 129 |
EOPNOTSUPP | 不支持操作。 | 130 |
EOTHER | 其他。 | 131 |
EOVERFLOW | 值太大。 | 132 |
EOWNERDEAD | 所有者亡。 | 133 |
EPROTO | 协议错误。 | 134 |
EPROTONOSUPPORT | 协议不受支持。 | 135 |
EPROTOTYPE | 协议类型错误。 | 136 |
ETIME | 流超时。 | 137 |
ETIMEDOUT | 已超时。 | 138 |
ETXTBSY | 文本文件繁忙。 | 139 |
EWOULDBLOCK | 操作将阻塞。 | 140 |
数学常量
常见的数学常量提供了多个预定义的预处理器宏。
语法
#define _USE_MATH_DEFINES // for C++
#include <cmath>
#define _USE_MATH_DEFINES // for C
#include <math.h>
备注
下列符号定义了其所指示的表达式的值:
符号 | 表达式 | 值 |
---|---|---|
M_E | e | 2.71828182845904523536 |
M_LOG2E | log2(e) | 1.44269504088896340736 |
M_LOG10E | log10(e) | 0.434294481903251827651 |
M_LN2 | ln(2) | 0.693147180559945309417 |
M_LN10 | ln(10) | 2.30258509299404568402 |
M_PI | pi | 3.14159265358979323846 |
M_PI_2 | pi/2 | 1.57079632679489661923 |
M_PI_4 | pi/4 | 0.785398163397448309616 |
M_1_PI | 1/pi | 0.318309886183790671538 |
M_2_PI | 2/pi | 0.636619772367581343076 |
M_2_SQRTPI | 2/sqrt(pi) | 1.12837916709551257390 |
M_SQRT2 | sqrt(2) | 1.41421356237309504880 |
M_SQRT1_2 | 1/sqrt(2) | 0.707106781186547524401 |
数学常量未在标准 C/C++ 中定义。 若要使用它们,必须先定义 _USE_MATH_DEFINES
,然后包括 <cmath>
或 <math.h>
。
在“发布模式”下生成项目时,文件 <ATLComTime.h>
包含 <math.h>
。 如果在同时包含 <ATLComTime.h>
的项目中使用了一个或多个数学常量,则在包含 <ATLComTime.h>
前必须先定义 _USE_MATH_DEFINES
。
数学错误常量
语法
#include <math.h>
备注
运行库的数学例程可生成数学错误常量。
如下所述,这些错误对应于 MATH.H 中定义的异常类型,并在发生数学错误后由
_matherr
函数返回。
返回的常量 | 含义 |
---|---|
_DOMAIN | 函数的自变量位于函数域的外部。 |
_OVERFLOW | 结果太大而无法在函数的返回类型中表示。 |
_PLOSS | 发生了有效位部分丢失的情况。 |
_SING | 自变量奇异性:函数的自变量具有非法值。 (例如,将值 0 传递到需要非零值的函数。) |
_TLOSS | 发生了有效位完全丢失的情况。 |
_UNDERFLOW | 结果太小而无法表示。 |
共享常量
文件共享模式的常量。
语法
#include <share.h>
备注
该 shflag
参数确定共享模式,该模式由一个或多个清单常量组成。 这些常量可以与 oflag
参数结合使用, (请参阅 文件常量) 。
下表列出了常量及其含义:
返回的常量 | 含义 |
---|---|
_SH_DENYRW | 拒绝对文件的读写访问权限 |
_SH_DENYWR | 拒绝对文件的写访问权限 |
_SH_DENYRD | 拒绝对文件的读访问权限 |
_SH_DENYNO | 允许读写访问权限 |
_SH_SECURE | 设置安全模式(共享读取、独占写入访问权限)。 |
转换模式常量
语法
#include <fcntl.h>
备注
_O_BINARY
和 _O_TEXT
清单常数将决定文件(_open
和 _sopen
)的转换模式或流 (_setmode
) 的转换模式。
允许的值为:
值 | 说明 |
---|---|
_O_TEXT | 在文本(已转换)模式下打开文件。 输入时回车符–换行符 (CR-LF) 组合将转换为单个换行符 (LF)。 输出时换行符将转换为 CR-LF 组合。 CTRL+Z 也将在输入时解释为文件尾字符。 在打开以进行读取或读取和写入的文件中,fopen 将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 由于使用 fseek 和 ftell 函数在以 CTRL+Z 结尾的文件内移动可能会导致 fseek 在文件末尾附近行为不当而被删除。 |
_O_BINARY | 在二进制(未转换)模式下打开文件。 禁止上述的转换。 |
_O_RAW | 与 _O_BINARY 相同。 支持 C 2.0 兼容性。 |
文件读/写访问常量
语法
#include <stdio.h>
备注
这些常量指定为文件请求的访问类型(“a”、“r”或“w”)。 可以使用访问类型来指定转换模式(“b”或“t”)和 模式(“c”或“n”)。
访问类型如下表中所述:
访问类型 | 说明 |
---|---|
"r " | 打开以便读取。 如果文件不存在或找不到,则打开该文件的调用将失败。 |
"w " | 打开用于写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
"a " | 打开以在文件末尾写入 (追加) ;如果文件不存在,请先创建该文件。 所有写入操作均在文件末尾发生。 尽管可以使用或rewind 重新定位fseek 文件指针,但在执行任何写入操作之前,它始终会移回到文件的末尾。 |
"r+ " | 打开以便读取和写入。 如果文件不存在或找不到,则打开该文件的调用将失败。 |
"w+ " | 打开用于读取和写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
"a+ " | 与 “”a 相同, 但也允许读取。 |
指定“r+”、“w+”或“a+”类型时,允许读取和写入(文件将处于打开状态以进行“更新”)。 但是,在读取与写入之间切换时,必须有中间 fflush
、fsetpos
、fseek
或 rewind
操作。 可以为 fsetpos
或 fseek
操作指定当前位置。
NULL
(CRT)
NULL
是用于许多指针操作和函数的 null 指针值。 它等效于 0。 NULL
在以下头文件中定义:CRTDBG。H、LOCALE。H、STDDEF。H、STDIO。H、STDLIB。H、STRING。H、TCHAR。H,时间。H 和 WCHAR.H.
stdin
, stdout
, stderr
语法
FILE *stdin;
FILE *stdout;
FILE *stderr;
#include <stdio.h>
备注
和stdin
stdout
stderr
全局常量指针是输入、输出和错误输出的标准流。
默认情况下,标准输入是从键盘读取的,而标准输出和错误输出将打印到屏幕。
下列流指针可用于访问标准流:
指针 | Stream |
---|---|
stdin | 标准输入 |
stdout | 标准输出 |
stderr | 标准错误 |
这些指针可用作函数自变量。 一些函数(如 getchar 和 putchar)将自动使用
stdin
和stdout
。这些指针是常量,不能分配新值。 freopen 函数可用于将流重定向到磁盘文件或其他设备。 操作系统使您可以在命令级别重定向程序的标准输入和输出。