引言
前面的章节介绍了任务执行框架及其实际应用的一些内容。
本篇开始将分析在使用任务执行框架时需要注意的各种情况,并介绍对线程池进行配置与调优的一些方法。
函数声明 | 函数功能 |
---|---|
double j0 (double x); |
计算 x 的 第一类 0 阶贝塞尔函数(double) |
float j0f (float x); |
计算 x 的 第一类 0 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
double j1 (double x); |
计算 x 的 第一类 1 阶贝塞尔函数(double) |
float j1f (float x); |
计算 x 的 第一类 1 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
double jn (int n, double x); |
计算 x 的 第一类 n 阶贝塞尔函数(double) |
float jnf (int n, float x); |
计算 x 的 第一类 n 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
double jrand48(); |
生成伪随机数序列 |
int join(pthread_t thread, void **retval); |
等待线程退出并回收资源 |
typedef _JBTYPE jmp_buf[_JBLEN]; |
它是一个数组类型,保存跳转目标地址的缓冲区。通常与 setjmp 和 longjmp 函数一起使用,用于实现非局部跳转 |
u32 jhash(const void *key, u32 length, u32 initval); |
它是 Linux 内核头文件 linux/jhash.h 中的一个函数,用于实现一种高效的哈希算法。 |
unsigned long volatile jiffies; |
它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。其中 volatile 关键字用于告知编译器在访问这个变量时不要使用缓存,以确保能够正确读取最新值。 |
u64 jiffies_64; |
它是 Linux 内核中的一个全局变量,类似于 jiffies ,但是支持更大的取值范围。其中 u64 是 64 位无符号整型。 |
clock_t jiffies_delta_to_clock_t(unsigned long delta); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为 clock_t 类型的值。 |
unsigned long jiffies_delta_to_msecs(unsigned long delta); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为毫秒数 |
clock_t jiffies_to_clock_t(unsigned long jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为 clock_t 类型的值。 |
unsigned long jiffies_to_msecs(const unsigned long j); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为毫秒数。 |
clock_t jiffies64_to_clock_t(u64 jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为 clock_t 类型的值。 |
u64 jiffies64_to_msecs(const u64 jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为毫秒数。 |
void jiffies_update_wallclock(void); |
它是 Linux 内核头文件 linux/time.h 中的一个函数,用于更新系统时钟的时间戳。 |
函数声明 | 函数功能 |
---|---|
double j0 (double x); |
计算 x 的 第一类 0 阶贝塞尔函数(double) |
float j0f (float x); |
计算 x 的 第一类 0 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
注意: 如果操作成功,则返回 x 的 第一类 0 阶贝塞尔函数;如果 x 是 NaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE。
1 |
|
函数声明 | 函数功能 |
---|---|
double j1 (double x); |
计算 x 的 第一类 1 阶贝塞尔函数(double) |
float j1f (float x); |
计算 x 的 第一类 1 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
注意: 如果操作成功,则返回 x 的 第一类 1 阶贝塞尔函数;如果 x 是 NaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE。
1 |
|
函数声明 | 函数功能 |
---|---|
double jn (int n, double x); |
计算 x 的 第一类 n 阶贝塞尔函数(double) |
float jnf (int n, float x); |
计算 x 的 第一类 n 阶贝塞尔函数(float)【笔者本地windows环境,无此函数】 |
注意: 如果操作成功,则返回 x 的 第一类 n 阶贝塞尔函数;如果 x 是 NaN 值,则返回 NaN 值;如果 x 太大或发生溢出范围错误,则返回 0 并将 errno 设置为 ERANGE。
1 |
|
函数声明 | 函数功能 |
---|---|
double jrand48(); |
生成伪随机数序列 |
jrand48 函数是一个生成伪随机数序列的函数,并且它是可重入的,即可以在多个线程中同时调用而不会出现冲突。
1 |
|
上述程序首先通过 srand48 函数初始化随机数生成器的种子,这里使用了当前系统时间作为种子。然后循环调用 jrand48 函数 5 次,每次输出一个伪随机数。注意,由于 jrand48 函数返回的是一个双精度浮点数(范围在 [0, 1) 内),因此输出时需要使用 %f 格式化符号。
函数声明 | 函数功能 |
---|---|
int join(pthread_t thread, void **retval); |
等待线程退出并回收资源 |
在 C 语言中,join 函数不是标准库函数,也不是 POSIX 标准的函数。然而,一些操作系统(如 UNIX/Linux)提供了 join 函数用于等待线程退出并回收资源。在 POSIX 线程中,相应的函数是 pthread_join。
1 |
|
上述程序创建了一个新线程,并且主线程等待新线程退出后才继续执行。在新线程中,打印一条消息并调用 pthread_exit 函数退出线程。在主线程中,调用 join 函数等待新线程退出,并通过 NULL 参数指示不需要返回值。最终输出一条消息表示新线程已经退出。
类型定义 | 描述 |
---|---|
typedef _JBTYPE jmp_buf[_JBLEN]; |
它是一个数组类型,保存跳转目标地址的缓冲区。通常与 setjmp 和 longjmp 函数一起使用,用于实现非局部跳转 |
1 |
|
上述程序定义了一个名为 env 的 jmp_buf 类型变量,用于保存当前执行状态。在主函数中,通过调用 setjmp 函数将当前状态保存到
env 中,并返回 0。然后调用 func 函数,该函数打印一条消息并调用 longjmp 函数恢复之前保存的状态,这里传入参数值为 1。由于 longjmp 函数会导致程序跳转到 setjmp 函数继续执行,因此后面的 printf 语句会输出 "Returning from longjmp with value 1"
。
需要注意的是,在使用 jmp_buf、setjmp 和 longjmp 函数时需要遵循特定的使用规范,否则可能会导致未定义行为或错误。
函数声明 | 函数功能 |
---|---|
u32 jhash(const void *key, u32 length, u32 initval); |
它是 Linux 内核头文件 linux/jhash.h 中的一个函数,用于实现一种高效的哈希算法。 |
参数:
- key : 要进行哈希的数据
- length : 数据的长度(以字节为单位)
- initval : 哈希值的初始值。
1 |
|
上述示例程序中,在 my_init()
函数中定义了一个字符串 data,并使用 jhash()
函数计算出其哈希值,并打印出来。
注意: 虽然
jhash()
函数可以用于快速查找和管理数据结构等,但在使用时必须充分理解其作用原理和使用方法,避免因为错误使用导致哈希冲突或其他问题。同时,应当根据具体情况选择合适的哈希算法,并考虑其效率和安全性等方面的因素。
变量声明 | 变量描述 |
---|---|
unsigned long volatile jiffies; |
它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。其中 volatile 关键字用于告知编译器在访问这个变量时不要使用缓存,以确保能够正确读取最新值。 |
u64 jiffies_64; |
它是 Linux 内核中的一个全局变量,类似于 jiffies ,但是支持更大的取值范围。其中 u64 是 64 位无符号整型。 |
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 jiffies_64 值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies_64
值与之前的 jiffies_64
值之差,计算出经过的时间并打印出来。
注意:
jiffies
和jiffies_64
值每隔一段时间就会发生一次溢出,在处理jiffies
和jiffies_64
值时必须注意这个问题,避免计算结果错误。另外,jiffies
和jiffies_64
变量只能在内核空间中使用,不能在用户空间中使用。
函数声明 | 函数功能 |
---|---|
clock_t jiffies_delta_to_clock_t(unsigned long delta); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为 clock_t 类型的值。 |
参数:
- delta : 要计算的 jiffies 时间差值。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 jiffies
值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies
值与之前的 jiffies
值之差,并调用 jiffies_delta_to_clock_t()
函数,计算出经过的时间并打印出来。
注意: 在使用
jiffies_delta_to_clock_t()
函数时,返回值类型是clock_t
,不同于jiffies_delta_to_msecs()
函数的返回值类型是unsigned long
。另外,clock_t
的定义可能因系统而异,应当根据具体情况进行处理。
函数声明 | 函数功能 |
---|---|
unsigned long jiffies_delta_to_msecs(unsigned long delta); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于计算两个 jiffies 值之间的时间差,并将结果转换为毫秒数 |
参数:
- delta : 要计算的 jiffies 时间差值。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 jiffies
值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies
值与之前的 jiffies
值之差,并调用 jiffies_delta_to_msecs()
函数,计算出经过的时间并打印出来。
注意: 在使用 jiffies_delta_to_msecs() 函数时,返回值类型是 unsigned long,不同于 jiffies_delta_to_clock_t() 函数的返回值类型是 clock_t。另外,由于 jiffies 的精度限制,计算结果可能存在一定的误差。
函数声明 | 函数功能 |
---|---|
clock_t jiffies_to_clock_t(unsigned long jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为 clock_t 类型的值。 |
参数:
- jiffies: 要转换的 jiffies 值,它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 jiffies 值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差并调用 jiffies_to_clock_t()
函数,计算出经过的时间,并打印出来。
注意: 在使用
jiffies_to_clock_t()
函数时,返回值类型是clock_t
,不同于jiffies_to_msecs()
函数的返回值类型是unsigned long
。另外,clock_t
的定义可能因系统而异,应当根据具体情况进行处理。
函数声明 | 函数功能 |
---|---|
unsigned long jiffies_to_msecs(const unsigned long j); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 jiffies 值(内核节拍数)转换为毫秒数。 |
参数:
- j: 要转换的 jiffies 值,它是 Linux 内核中的一个全局变量,表示内核启动后经过的节拍数。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 jiffies 值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 jiffies 值与之前的 jiffies 值之差并调用 jiffies_to_msecs()
函数,计算出经过的时间,并打印出来。
注意: 在使用
jiffies_to_msecs()
函数时,必须十分小心地处理 jiffies 值的溢出等问题,以免计算结果错误。另外,jiffies_to_msecs()
函数只能用于内核空间中,不能在用户空间中使用。
函数声明 | 函数功能 |
---|---|
clock_t jiffies64_to_clock_t(u64 jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为 clock_t 类型的值。 |
参数:
- jiffies : 要转换的 64 位 jiffies 值。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 64 位 jiffies_64
值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 64 位 jiffies_64
值与之前的 jiffies_64
值之差,并调用 jiffies64_to_clock_t()
函数,计算出经过的时间并打印出来。
函数声明 | 函数功能 |
---|---|
u64 jiffies64_to_msecs(const u64 jiffies); |
它是 Linux 内核头文件 linux/jiffies.h 中的一个函数,用于将 64 位 jiffies 值(内核节拍数)转换为毫秒数。 |
参数:
- jiffies : 要转换的 64 位 jiffies 值。
1 |
|
上述示例程序中,在 my_init()
函数中获取了当前的 64 位 jiffies_64
值,并使用 mdelay()
函数让程序阻塞一段时间。在之后,通过计算当前的 64 位 jiffies_64
值与之前的 jiffies_64
值之差,并调用 jiffies64_to_msecs()
函数,计算出经过的时间并打印出来。
函数声明 | 函数功能 |
---|---|
void jiffies_update_wallclock(void); |
它是 Linux 内核头文件 linux/time.h 中的一个函数,用于更新系统时钟的时间戳。 |
1 |
|
上述示例程序中,在 my_init()
函数中使用 mdelay()
函数让程序阻塞一段时间,在之后调用 jiffies_update_wallclock()
函数更新系统时钟的时间戳。
注意:
jiffies_update_wallclock()
函数只能在内核空间中使用,不能在用户空间中使用。另外,如果系统使用了 NTP 等网络时间同步服务,可能无法通过jiffies_update_wallclock()
函数来准确更新系统时钟。
函数声明 | 函数功能 |
---|---|
unsigned imagesize(int left, int top, int right, int bottom); |
获取保存位图像所需的字节数 |
void initgraph( int *graphdriver, int *graphmode, char *pathtodriver ); |
初始化图形系统 |
int inport(int protid); |
从硬件端口中输入 |
void insline(void); |
在文本窗口中插入一个空行 |
int installuserdriver(char *name, int (*detect)(void)); |
安装设备驱动程序到BGI设备驱动程序表中 |
int installuserfont( char *name ); |
安装未嵌入BGI系统的字体文件(CHR) |
int int86(int intr_num, union REGS *inregs, union REGS *outregs); |
通用8086软中断接口 |
int int86x(int intr_num, union REGS *insegs, union REGS *outregs, struct SREGS *segregs); |
通用8086软中断接口 |
int intdos(union REGS *inregs, union REGS *outregs); |
通用DOS接口 |
int intdosx(union REGS *inregs, union REGS *outregs, struct SREGS *segregs); |
通用DOS中断接口 |
void intr(int intr_num, struct REGPACK *preg); |
改变软中断接口 |
int ioctl(int fd, int cmd, ...) ; |
控制 I/O 设备 |
int isatty(int handle); |
检查设备类型 |
int ilogb (double x); |
获取 x 的对数的积分部分(double) |
int ilogbf (float x); |
获取 x 的对数的积分部分(float) |
int ilogbl (long double x); |
获取 x 的对数的积分部分(long double) |
char * itoa(int value, char *string, int radix); |
把一整数转换为字符串 |
函数声明 | 函数功能 |
---|---|
unsigned imagesize(int left, int top, int right, int bottom); |
获取保存位图像所需的字节数 |
参数:
left
:矩形区域左边界的 x 坐标(水平方向起始位置)。top
:矩形区域上边界的 y 坐标(垂直方向起始位置)。right
:矩形区域右边界的 x 坐标(水平方向结束位置,需满足 right >= left)。bottom
:矩形区域下边界的 y 坐标(垂直方向结束位置,需满足 bottom >= top)。1 |
|
上述代码利用图形库实现了一个在屏幕上移动箭头图形的动画效果。
函数声明 | 函数功能 |
---|---|
void initgraph( int *graphdriver, int *graphmode, char *pathtodriver); |
初始化图形系统 |
参数:
int *graphdriver
: 一个指向整数的指针。用于指定要使用的图形驱动程序。图形驱动程序是一组软件代码,负责与特定的图形硬件进行通信。常见的图形驱动程序有 DETECT(自动检测系统中可用的图形硬件并选择合适的驱动程序)、EGAVGA_driver(用于 EGA 或 VGA 显示器)等。int *graphmode
:一个指向整数的指针。用于指定要使用的图形模式。不同的图形驱动程序支持多种图形模式,每种模式具有不同的分辨率、颜色深度等特性。如果 graphdriver
参数设置为 DETECT,则可以将 graphmode
指针指向的变量初始化为 0
,让系统自动选择合适的图形模式。char *pathtodriver
:一个指向字符的指针。用于指定图形驱动程序文件的路径。图形驱动程序通常以 .BGI
为扩展名的文件形式存在。如果该参数设置为 ""
(空字符串),则系统会在当前目录下查找图形驱动程序文件。1 |
|
函数声明 | 函数功能 |
---|---|
int inport(int protid); |
从硬件端口中输入,即从指定的 I/O 端口读取一个 16 位(2 字节)的数据 |
参数:
portid
:要读取数据的 I/O 端口号。不同的硬件设备会使用不同的端口号,比如,键盘控制器常用的端口号是 0x60
。在使用 inport
函数时,需要根据具体的硬件设备和操作需求来确定正确的端口号。返回值:
从指定 I/O 端口读取到的 16 位数据。若读取过程中出现错误,返回值的具体情况可能因系统和硬件而异。
1 |
|
函数声明 | 函数功能 |
---|---|
void insline(void); |
在当前光标位置插入一行空行,原光标所在行及其下方的所有行都会向下移动一行 【在 Turbo C 等早期 C 编译器的图形库或控制台操作库中使用】 |
1 |
|
函数声明 | 函数功能 |
---|---|
int installuserdriver(char *name, int (*detect)(void)); |
安装设备驱动程序到BGI设备驱动程序表中 |
注意: 该函数在 WinBGI 中不可用
1 |
|
函数声明 | 函数功能 |
---|---|
int installuserfont( char *name ); |
安装未嵌入BGI系统的字体文件(CHR) |
注意: 该函数在 WinBGI 中不可用
1 |
|
函数声明 | 函数功能 |
---|---|
int int86(int intr_num, union REGS *inregs, union REGS *outregs); |
通用8086软中断接口,用于在 DOS 环境下执行软件中断调用 |
参数:
int intr_num
:指定要执行的中断号。在 DOS 系统中,不同的中断号对应着不同的功能。例如,中断号 0x10
通常用于 BIOS 的视频服务,中断号 0x21
用于 DOS 系统功能调用。union REGS *inregs
:一个指向 union REGS
联合体的指针,用于传递输入参数到中断服务程序。union REGS
联合体包含了多个寄存器的成员,允许你设置不同寄存器的值,以满足特定中断服务的要求。union REGS *outregs
:一个指向 union REGS
联合体的指针。用于接收 DOS 中断服务程序返回的结果。当 intdosx
函数调用完成后,DOS 中断服务程序会将返回值存储在相应的寄存器中,通过 outregs
可以获取这些返回值。union REGS 联合体:
1 | union REGS { |
返回值: 中断服务程序执行的状态。
0
表示执行成功。1 |
|
函数声明 | 函数功能 |
---|---|
int int86x(int intr_num, union REGS *insegs, union REGS *outregs, struct SREGS *segregs); |
通用8086软中断接口,是一个在 DOS 环境下使用的函数,主要用于执行指定中断号的软件中断。 |
参数:
int intr_num
:参考7中所示union REGS *inregs
:参考7中所示union REGS *outregs
:参考7中所示struct SREGS *segregs
: 一个指向 struct SREGS
结构体的指针。struct SREGS
结构体包含了多个段寄存器成员,如 ds、es、ss
等。在某些 DOS 功能调用中,可能需要设置或获取段寄存器的值,这时就可以使用 segregs
参数。struct SREGS 结构体:
1 | struct SREGS { |
返回值: 中断服务程序执行的状态。
0
表示执行成功。1 |
|
函数声明 | 函数功能 |
---|---|
int intdos(union REGS *inregs, union REGS *outregs); |
执行一次 DOS 软件中断(通常是中断向量号为 0x21 的中断) |
参数:
union REGS *inregs
:一个指向 union REGS
联合体的指针。用于向 DOS 中断服务程序传递输入参数。union REGS
联合体把 8
位寄存器(如 AH、AL 等)和 16
位寄存器(如 AX、BX 等)组合在一起,方便开发者设置不同大小的寄存器值。在调用 intdos
之前,你要依据具体的 DOS 功能需求,把相应的参数存于 inregs
所指向的联合体中。union REGS *outregs
:一个指向 union REGS
联合体的指针。用于接收 DOS 中断服务程序返回的结果。当 intdosx
函数调用完成后,DOS 中断服务程序会将返回值存储在相应的寄存器中,通过 outregs
可以获取这些返回值。1 |
|
函数声明 | 函数功能 |
---|---|
int intdosx(union REGS *inregs, union REGS *outregs, struct SREGS *segregs); |
它主要作用是触发一个 DOS 软件中断(通常是中断号 0x21 ),并通过寄存器传递参数和获取返回值,从而实现对 DOS 系统功能的调用。 |
参数:
union REGS *inregs
:参考 9 中所示union REGS *outregs
:参考 9 中所示struct SREGS *segregs
: 一个指向 struct SREGS
结构体的指针。struct SREGS
结构体包含了多个段寄存器成员,如 ds、es、ss
等。在某些 DOS 功能调用中,可能需要设置或获取段寄存器的值,这时就可以使用 segregs
参数。返回值:
DOS 中断调用的状态。通常,返回值为 0
表示调用成功,非零值表示调用过程中出现错误。
1 |
|
函数声明 | 函数功能 |
---|---|
void intr(int intr_num, struct REGPACK *preg); |
它是一个在早期 DOS 环境下用于进行软件中断调用的函数 |
参数:
int intr_num
:要调用的中断号。在 DOS 和 BIOS 系统中,不同的中断号对应着不同的功能。例如,中断号 0x10
通常用于 BIOS 的视频服务,中断号 0x21
用于 DOS 系统功能调用。struct REGPACK *preg
:这是一个指向 struct REGPACK
结构体的指针。struct REGPACK
结构体用于存储和传递 CPU 寄存器的值。在调用中断之前,你可以通过该结构体设置输入参数(即设置寄存器的值);中断调用完成后,该结构体中的值会被更新为中断服务程序返回的结果。1 | struct REGPACK { |
这个结构体包含了多个成员,分别对应不同的 CPU 寄存器。例如:
r_ax
对应 AX 寄存器。r_bx
对应 BX 寄存器。r_cx、r_dx
等分别对应 CX、DX 等寄存器。1 |
|
函数声明 | 函数功能 |
---|---|
int ioctl(int fd, int cmd, ...) ; |
控制 I/O 设备 |
参数:
fd
:文件描述符 cmd
: 交互协议,设备驱动将根据 cmd 执行对应操作…
: 可变参数arg,依赖 cmd 指定长度以及类型1 |
|
函数声明 | 函数功能 |
---|---|
int isatty(int handle); |
用于检查给定的文件描述符(file descriptor)是否关联到一个终端设备(teletype,即 TTY) |
它通常用于判断程序是否运行在交互式终端环境中,从而决定是否启用终端相关的功能(如彩色输出、交互式输入等)。
参数:
handle
:文件描述符(file descriptor),例如:0(标准输入)、1(标准输出)、2(标准错误)。1 |
|
函数声明 | 函数功能 |
---|---|
int ilogb (double x); |
获取 x 的对数的积分部分(double) |
int ilogbf (float x); |
获取 x 的对数的积分部分(float) |
int ilogbl (long double x); |
获取 x 的对数的积分部分(long double) |
如果计算成功,则返回 x 的对数的整数部分。如果 x 为 0,则此函数返回FP_ILOGB0 并报告错误。如果 x 是NaN值,则此函数返回 FP_ILOGBNAN 并报告错误。如果 x 是正无穷大或负无穷大,此函数将返回 INT_MAX 并报告错误。
1 |
|
函数声明 | 函数功能 |
---|---|
char * itoa(int value, char *string, int radix); |
把一整数转换为字符串 |
参数:
value
: 被转换的整数string
: 转换后储存的字符数组radix
: 转换进制数,如2,8,10,16 进制等,大小应在2-36之间1 |
|
函数声明 | 函数功能 |
---|---|
double hypot(double x, double y); |
计算直角三角形的斜边长(double) |
float hypotf (float x, float y); |
计算直角三角形的斜边长(float) |
long double hypot(long double x, long double y); |
计算直角三角形的斜边长(long double) |
#define HUGE_VAL _HUGE |
正浮点常量表达式(double),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
#define HUGE_VALF __INFF |
正浮点常量表达式(float),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
#define HUGE_VALL __INFL |
正浮点常量表达式(long double),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
void harderr(int (*fptr)()); |
建立一个硬件错误处理程序 |
void hardresume(int rescode); |
硬件错误处理函数 |
void hardretn(int rescode); |
硬件错误处理函数 |
void highvideo(void); |
选择高亮度文本字符 |
int hcreate(size_t nel); |
根据条目数创建哈希表。 |
int hcreate_r(size_t nel, struct hsearch_data *htab); |
根据条目数及其描述创建哈希表。 |
ENTRY *hsearch(ENTRY item, ACTION action); |
添加或搜索哈希条目。 |
int hsearch_r (ENTRY item, ACTION action, ENTRY ** retval, struct hsearch_data * htab ) |
搜索哈希表。 |
void hdestroy(void); |
销毁哈希表,释放用于创建哈希表的内存。 |
void hdestroy_r(struct hsearch_data *htab); |
销毁哈希表,释放指定哈希表所占用的内存。 |
函数声明 | 函数功能 |
---|---|
double hypot(double x, double y); |
计算直角三角形的斜边长(double) |
float hypotf (float x, float y); |
计算直角三角形的斜边长(float) |
long double hypot(long double x, long double y); |
计算直角三角形的斜边长(long double) |
1 |
|
宏定义 | 宏描述 |
---|---|
#define HUGE_VAL _HUGE |
正浮点常量表达式(double),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
#define HUGE_VALF __INFF |
正浮点常量表达式(float),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
#define HUGE_VALL __INFL |
正浮点常量表达式(long double),这些表达式与浮点函数和运算符在溢出时返回的值相比较 |
1 |
|
函数声明 | 函数功能 |
---|---|
void harderr(int (*fptr)()); |
建立一个硬件错误处理程序 |
void hardresume(int rescode); |
硬件错误处理函数 |
void hardretn(int rescode); |
硬件错误处理函数 |
1 |
|
上述程序是一个基于DOS环境的磁盘错误处理示例。在磁盘操作出现错误时,向用户显示具体的错误消息,并提供 “中止”、“重试” 和 “忽略” 三种处理选项,根据用户的选择进行相应的处理。
函数声明 | 函数功能 |
---|---|
void highvideo(void); |
选择高亮度文本字符 |
1 |
|
上述利用 <conio.h>
头文件中的函数实现特定的控制台文本显示效果。
clrscr()
函数清空控制台窗口。lowvideo()
将文本显示设置为低亮度,使用 cprintf()
输出低亮度的 "Low Intensity text"
文本并换行。highvideo()
把文本显示切换为高亮度,利用 gotoxy(1, 2)
将光标定位到第 1 列第 2 行,再用 cprintf()
输出高亮度的 "High Intensity Text"
文本并换行,以此直观展示控制台中低亮度和高亮度两种不同的文本显示效果。不过需要留意,
conio.h
并非标准 C 库的一部分,它主要在像 Turbo C 这类旧的编译器中使用,而在现代开发环境里可能不被支持。
函数声明 | 函数功能 |
---|---|
int hcreate(size_t nel); |
根据条目数创建哈希表。 |
int hcreate_r(size_t nel, struct hsearch_data *htab); |
根据条目数及其描述创建哈希表。 |
入参:
- net : 哈希表中允许的最大项数。
- htab : 哈希表的结构体数据。
返回值:
- 如果操作成功,则返回一个非零值;
- 如果操作失败,则返回 0 并将 errno 设置为一个值。
1 |
|
函数声明 | 函数功能 |
---|---|
ENTRY *hsearch(ENTRY item, ACTION action); |
添加或搜索哈希条目。 |
int hsearch_r (ENTRY item, ACTION action, ENTRY ** retval, struct hsearch_data * htab ) |
搜索哈希表。 |
注意:
hsearch
和hsearch_r
函数根据指定的操作在哈希表中搜索条目。如果操作为 FIND,则仅执行搜索操作。如果操作为 ENTER,则未找到的条目将添加到哈希表中。hsearch_r
函数与hsearch
函数的不同之处在于,指向找到的项的指针以*retval
形式返回,而不是作为函数结果。
入参:
- item: 要搜索的哈希表条目。
- action: 功能操作。
ENTER
表示已添加条目,FIND
表示已搜索条目。- retval: 指向找到的项的指针。
- htab : 哈希表的结构体数据。
hsearch 函数返回值:
- 如果操作成功,则返回指向哈希表的指针。
hsearch_r 函数返回值:
- 如果操作成功,则返回一个非零值;
- 如果操作失败,则返回 0。
参考 5.2
函数声明 | 函数功能 |
---|---|
void hdestroy(void); |
销毁哈希表,释放用于创建哈希表的内存。 |
void hdestroy_r(struct hsearch_data *htab); |
销毁哈希表,释放指定哈希表所占用的内存。 |
参考 5.2
函数声明 | 函数功能 |
---|---|
uint32_t htonl(uint32_t hostlong); |
将 uint32_t(32位整数,如IPv4地址)从主机字节序转为网络字节序。 |
uint16_t htons(uint16_t hostshort); |
将 uint16_t(16位整数,如端口号)从主机字节序转为网络字节序(大端)。 |
1 |
|
函数声明 | 函数功能 |
---|---|
char * getmodename(int mode_name); |
获取指定的图形模式名 |
void getmoderange(int graphdriver, int *lomode, int *himode); |
获取给定图形驱动程序的模式范围 |
void getpalette(struct palettetype *palette); |
获取有关当前调色板的信息 |
int getpixel(int x, int y); |
获取得指定像素的颜色 |
char *gets(char *str); |
从标准输入流中读取字符串,直至遇到到换行符或EOF时停止,并将读取的结果存放在 buffer 指针所指向的字符数组中。 换行符不作为读取串的内容,读取的换行符被转换为 '\0' 空字符,并由此来结束字符串。 |
void gettextsettings(struct textsettingstype *textinfo); |
获取有关当前图形文本字体的信息 |
void getviewsettings(struct viewporttype *viewport); |
获取有关当前视区的信息 |
int getw(FILE *strem); |
从 stream 所指向文件读取下一个整数 |
int getx(void); |
获取当前图形位置的 x 坐标 |
int gety(void); |
获取当前图形位置的 y 坐标 |
struct tm *gmtime(long *clock); |
把日期和时间转换为格林尼治标准时间(GMT) |
void graphdefaults(void); |
将所有图形设置复位为它们的缺省值 |
char * grapherrormsg(int errorcode); |
返回一个错误信息串的指针 |
int graphresult(void); |
返回最后一次不成功的图形操作的错误代码 |
int getmaxwidth(void); |
获取屏幕的最大宽度 |
int getmaxheight(void); |
获取屏幕的最大高度 |
int getdisplaycolor( int color ); |
根据 color ,返回要显示的颜色值 |
int getwindowwidth(); |
获取图形界面窗口宽度 |
int getwindowheight(void); |
获取图形界面窗口高度 |
bool getrefreshingbgi(void); |
获取刷新基础图形界面标识 |
函数声明 | 函数功能 |
---|---|
char * getmodename(int mode_name); |
获取指定的图形模式名 |
参数:
mode_name
: 当前图形模式的模式代码。不同的图形模式对应不同的分辨率、颜色深度和显示模式。1 |
|
函数声明 | 函数功能 |
---|---|
void getmoderange(int graphdriver, int *lomode, int *himode); |
获取给定图形驱动程序的模式范围 |
参数:
graphdriver
: 图形驱动程序的标识符。不同的图形驱动程序有不同的标识符,用于指定你希望使用的图形硬件或软件环境。例如,在某些图形库中,特定的数字或宏定义(如DETECT)可以用来自动检测可用的图形驱动程序。lomode
: 一个指向整数的指针,用于接收指定图形驱动程序支持的最低显示模式编号。himode
: 一个指向整数的指针,用于接收指定图形驱动程序支持的最高显示模式编号。1 |
|
函数声明 | 函数功能 |
---|---|
void getpalette(struct palettetype *palette); |
获取有关当前调色板的信息 |
参数:
palette
: 一个指向palettetype
结构体的指针。palettetype
结构体通常包含了一系列元素,每个元素代表调色板中的一个颜色条目。在标准的图形库中(如Borland的BGI图形库),palettetype
结构体可能包含多个unsigned char
类型的成员,每个成员对应调色板中的一个颜色通道(如红色、绿色、蓝色),以及可能的其他信息(如亮度或透明度)。注意: palettetype结构体的确切定义可能依赖于你使用的图形库。在某些实现中,它可能是一个简单的数组,每个元素代表一个颜色(可能是RGB值的一个组合),或者是一个更复杂的结构体,包含了关于每个颜色条目的更多信息。
1 |
|
函数声明 | 函数功能 |
---|---|
int getpixel(int x, int y); |
获取得指定像素的颜色 |
参数:
x
: 想要获取的像素颜色值的点的横坐标。坐标原点(0, 0)
通常位于屏幕的左上角。y
: 想要获取的像素颜色值的点的纵坐标。返回值:
函数返回一个整数,该整数代表指定坐标 (x, y) 上像素的颜色编码。颜色编码的具体含义取决于你使用的图形库和当前的图形设置。在某些图形库中,这个整数可能直接代表一个RGB颜色值,其中不同的位或字节表示红色、绿色和蓝色通道的强度。在其他情况下,这个整数可能是一个索引值,指向当前调色板中的一个颜色条目。
1 |
|
函数声明 | 函数功能 |
---|---|
char *gets(char *str); |
从标准输入流中读取字符串,直至遇到到换行符或EOF时停止,并将读取的结果存放在 buffer 指针所指向的字符数组中。 换行符不作为读取串的内容,读取的换行符被转换为 '\0' 空字符,并由此来结束字符串。 |
注意: gets 函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
1 |
|
函数声明 | 函数功能 |
---|---|
void gettextsettings(struct textsettingstype *textinfo); |
获取有关当前图形文本字体的信息 |
参数:
textinfo
: 一个指向 textsettingstype
结构体的指针。该结构体用于存储当前的文本设置。textsettingstype
结构体的具体定义取决于你使用的图形库。在不同的图形库中,这个结构体可能包含不同的成员,以反映该库支持的文本设置选项。1 |
|
函数声明 | 函数功能 |
---|---|
void getviewsettings(struct viewporttype *viewport); |
获取有关当前视区的信息 |
参数:
viewport
: 一个指向 viewporttype
结构体的指针。该结构体用于存储当前的视口设置。调用 getviewsettings
函数后,这个结构体将被填充为当前的视口参数。 viewporttype
结构体的具体定义可能依赖于你使用的图形库,但通常它会包含以下成员:left, top
: 这两个成员定义了视口的左上角坐标。坐标原点通常位于屏幕的左上角。right, bottom
: 这两个成员定义了视口的右下角坐标。clip
: 一个用于指示视口是否启用裁剪的标志。如果启用了裁剪,那么任何在视口之外的图形输出都将被忽略。1 |
|
函数声明 | 函数功能 |
---|---|
int getw(FILE *strem); |
从 stream 所指向文件读取下一个整数 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getx(void); |
获取当前图形位置的 x 坐标 |
int gety(void); |
获取当前图形位置的 y 坐标 |
1 |
|
函数声明 | 函数功能 |
---|---|
struct tm *gmtime(long *clock); |
把日期和时间转换为格林尼治标准时间(GMT) |
1 |
|
函数声明 | 函数功能 |
---|---|
void graphdefaults(void); |
将所有图形设置复位为它们的缺省值 |
1 |
|
函数声明 | 函数功能 |
---|---|
char * grapherrormsg(int errorcode); |
返回一个错误信息串的指针 |
1 |
|
函数声明 | 函数功能 |
---|---|
int graphresult(void); |
返回最后一次不成功的图形操作的错误代码 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getmaxwidth(void); |
获取屏幕的最大宽度 |
int getmaxheight(void); |
获取屏幕的最大高度 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getdisplaycolor( int color ); |
根据 color ,返回要显示的颜色值 |
注意: color = -1 , 则返回 WHITE = 15 的颜色值;color < - 1 或 color > 15,则输出一个8位整数。
1 |
|
函数声明 | 函数功能 |
---|---|
int getwindowwidth(void); |
获取图形界面窗口宽度 |
int getwindowheight(void); |
获取图形界面窗口高度 |
1 |
|
函数声明 | 函数功能 |
---|---|
bool getrefreshingbgi(void); |
获取刷新基础图形界面标识 |
1 |
|
函数声明 | 函数功能 |
---|---|
char *gcvt(double value, int ndigit, char *buf); |
把浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针的函数。 |
void getarccoords(struct arccoordstype *arccoords); |
取最后一次调用arc的坐标 |
int getbkcolor(void); |
获取当前背景颜色 |
int getc(FILE *stream); |
从流中取字符 |
int getchar(void); |
从 stdin 流中读字符 |
int getcolor(void); |
当前画线的颜色 |
char *getcwd(char *buffer, int maxlen); |
获取当前工作目录 |
struct palettetype* getdefaultpalette(void); |
获取调色板定义结构 |
char *getdrivename(void); |
获取当前图形驱动程序名字 |
void getfillpattern(char *upattern); |
将用户定义的填充模式拷贝到内存中 |
void getfillsettings(struct fillsettingstype *fillinfo); |
获取有关当前填充模式和填充颜色的信息 |
int getgraphmode(void); |
获取当前图形模式 |
void getimage(int left, int top, int right, int bottom, void *bitmap); |
保存指定区域的屏幕上的像素图形到指定的内存区域 |
void getlinesettings(struct linesettingstype *lininfo); |
取当前线型、模式和宽度 |
int getmaxcolor(void); |
可以传给函数 setcolor 的最大颜色值 |
int getmaxx(void); |
屏幕的最大x坐标 |
int getmaxy(void); |
屏幕的最大y坐标 |
函数声明 | 函数功能 |
---|---|
char *gcvt(double value, int ndigit, char *buf); |
把浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针的函数。 |
参数:
value:
被转换的值。ndigit:
存储的有效数字位数。buf:
结果的存储位置。注意:
gcvt
函数把一个浮点值转换成一个字符串 (包括一个小数点和可能的符号字节) 并存储该字符串在buffer
中。该buffer
应足够大以便容纳转换的值加上结尾的 结束符'\0'
,它是自动添加的。
如果一个缓冲区的大小为ndigit + 1
,则gcvt
函数将覆盖该缓冲区的末尾。这是因为转换的字符串包括一个小数点以及可能包含符号和指数信息。
1 |
|
函数声明 | 函数功能 |
---|---|
void getarccoords(struct arccoordstype *arccoords); |
取最后一次调用arc的坐标 |
1 |
|
上述代码是一个简单的图形程序,使用了图形库函数 arc
来绘制一个弧线并显示其起始和结束点的坐标。
大致逻辑如下:
(midx, midy)
。45
度,结束角度为 270
度,半径为 100
像素。arc
函数时的坐标信息,并将其存储在 arcinfo
结构体中。sprintf
函数将起始点和结束点的坐标格式化为字符串。函数声明 | 函数功能 |
---|---|
int getbkcolor(void); |
获取当前背景颜色 |
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 |
|
上述也是一个简单的图形程序,通过使用图形库来绘制背景颜色变化。
下面来简单总结下:
(midx, midy)
。i
所代表的颜色。bkcolor
数组中。bkname
字符串中。函数声明 | 函数功能 |
---|---|
int getc(FILE *stream); |
从流中取字符 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getchar(void); |
从 stdin 流中读字符 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getcolor(void); |
当前画线的颜色 |
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 |
|
上述程序,通过使用图形库,在一个循环中遍历所有颜色,每次在屏幕中心显示当前颜色的名称和值,等待用户按键后更改颜色并清除屏幕,直到所有颜色展示完毕。
函数声明 | 函数功能 |
---|---|
char *getcwd(char *buffer, int maxlen); |
获取当前工作目录 |
注意:getcwd 函数是将当前工作目录的绝对路径复制到参数 buffer 所指的内存空间中,参数 maxlen 为 buffer 的空间大小。
1 |
|
函数声明 | 函数功能 |
---|---|
struct palettetype* getdefaultpalette(void); |
获取调色板定义结构 |
1 |
|
函数声明 | 函数功能 |
---|---|
char *getdrivename(void); |
获取当前图形驱动程序名字 |
1 |
|
函数声明 | 函数功能 |
---|---|
void getfillpattern(char *upattern); |
将用户定义的填充模式拷贝到内存中 |
1 |
|
函数声明 | 函数功能 |
---|---|
void getfillsettings(struct fillsettingstype *fillinfo); |
获取有关当前填充模式和填充颜色的信息 |
参数:
struct fillsettingstype *fillinfo
: 一个指向 fillsettingstype
结构体的指针,该结构体用于存储当前的填充模式设置。 fillsettingstype
结构体通常包含以下成员:int pattern
:指定填充图案的索引。 BGI库提供了一套预定义的填充图案,可以通过这个索引来选择。unsigned char color
:指定填充图案的颜色。 颜色通常是通过一个颜色索引来指定的,该索引对应于一个预定义的颜色表。1 |
|
函数声明 | 函数功能 |
---|---|
int getgraphmode(void); |
获取当前图形模式 |
1 |
|
函数声明 | 函数功能 |
---|---|
void getimage(int left, int top, int right, int bottom, void *bitmap); |
保存指定区域的屏幕上的像素图形到指定的内存区域 |
参数:
int left
:指定要获取的图像区域的左边界的x坐标,以像素为单位int top
: 指定要获取的图像区域的上边界的y坐标,以像素为单位int right
: 指定要获取的图像区域的右边界的x坐标,以像素为单位int bottom
:指定要获取的图像区域的下边界的y坐标,以像素为单位void *bitmap
: 指向存储获取到的图像数据的内存位置的指针,这个指针可以指向任何类型的数据。在实际使用中,这个指针通常指向一个预先分配好的缓冲区,该缓冲区的大小应足够存储指定区域的图像数据。1 |
|
函数声明 | 函数功能 |
---|---|
void getlinesettings(struct linesettingstype *lininfo); |
取当前线型、模式和宽度 |
参数:
struct linesettingstype *lininfo
: 一个指向 linesettingstype
结构体的指针,该结构体用于存储当前的线条绘制设置。linesettingstype
结构体通常包含以下成员:int linestyle
: 指定线条的类型。它通常是一个整数,用于选择预定义的线条样式,如实线、虚线、点线等。unsigned char upattern
: 对于某些线条样式(如虚线),该参数可能用于指定线条中点和空白的具体模式。int thickness
: 指定线条的宽度。在BGI中,线条的宽度可能是以像素为单位的,但具体实现可能有所不同。unsigned char color
: 指定线条的颜色。颜色通常是通过一个颜色索引来指定的,该索引对应于一个预定义的颜色表。1 |
|
函数声明 | 函数功能 |
---|---|
int getmaxcolor(void); |
可以传给函数 setcolor 的最大颜色值 |
1 |
|
函数声明 | 函数功能 |
---|---|
int getmaxx(void); |
屏幕的最大x坐标 |
int getmaxy(void); |
屏幕的最大y坐标 |
1 |
|
函数声明 | 函数功能 |
---|---|
double floor (double x); |
获取小于或等于 x 的最大整数(double)。 |
float floorf (float x); |
获取小于或等于 x 的最大整数(float)。 |
long double floorl (long double x) |
获取小于或等于 x 的最大整数(long double)。 |
int _flushall(void); |
清除所有缓冲区,返回打开的流(输入和输出)的数量 |
double fma (double x, double y, double z); |
计算x*y+z的值,并将结果四舍五入(double)。 |
float fmaf (float x, float y, float z ); |
计算x*y+z的值,并将结果四舍五入(float )。 |
long double fmal (long double x, long double y, long double z); |
计算x*y+z的值,并将结果四舍五入(double)。 |
double fmax (double x, double y); |
获取 x 和 y 中的最大值(double) |
float fmaxf (float x, float y); |
获取 x 和 y 中的最大值(float) |
long double fmaxl (long double x, long double y); |
获取 x 和 y 中的最大值(long double) |
double fmin (double x, double y); |
获取 x 和 y 中的最小值(double) |
float fminf (float x, float y); |
获取 x 和 y 中的最小值(float) |
long double fminl (long double x, long double y); |
获取 x 和 y 中的最小值(long double) |
double fmod (double x, double y); |
计算 x 除以 y 的余数(double)。 |
float fmodf (float x, float y); |
计算 x 除以 y 的余数(float)。 |
long double fmodl (long double x, long double y); |
计算 x 除以 y 的余数(long double)。 |
FILE *fopen(const char *filename, const char *mode); |
使用给定的模式mode打开filename所指向的文件。 |
int fprintf(FILE *stream, char *format[, argument,...]); |
格式化输出到一个流文件中 |
int fputc(int ch, FILE *stream); |
将字符【ch为字符的ascii码】写到文件指针stream所指向的文件的当前写指针的位置 |
int fputchar(char ch); |
送一个字符到标准输出流(stdout)中,出错则返回EOF |
int fputs(const char *str, FILE *stream); |
把字符串写入到指定的流( stream) 中,但不包括空字符。 |
int fread(void *buffer, int size, int count, FILE *stream); |
从给定输入流stream读取最多count个对象到数组buffer中 |
void free(void *ptr); |
释放ptr指向的存储空间 |
FILE * freopen(const char *filename, const char *mode, FILE *stream); |
以指定模式重新指定到另一个文件 |
double frexp (double x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(double)。 |
float frexpf (float x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(float)。 |
long double frexpl (long double x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(long double)。 |
int fscanf(FILE *stream, char *format[,argument...]); |
从一个流中执行格式化输入 |
int fseek(FILE *stream, long offset, int fromwhere); |
重定位流上的文件指针位置 |
int fsetpos(FILE *stream, const fpos_t *pos); |
将文件指针定位在pos指定的位置上。如果成功返回0,否则返回非0。 |
int fstat(int handle,struct stat *buf); |
由文件描述符获取文件状态 |
long ftell(FILE *stream); |
获取文件指针当前位置相对于文件首的偏移字节数 |
int fwrite(const void *ptr, int size, int nitems, FILE *stream); |
把ptr所指向的数组中的数据写入到给定流stream中 |
函数声明 | 函数功能 |
---|---|
double floor (double x); |
获取小于或等于 x 的最大整数(double)。 |
float floorf (float x); |
获取小于或等于 x 的最大整数(float)。 |
long double floorl (long double x) |
获取小于或等于 x 的最大整数(long double)。 |
1 |
|
函数声明 | 函数功能 |
---|---|
int _flushall(void); |
清除所有缓冲区,返回打开的流(输入和输出)的数量 |
1 |
|
函数声明 | 函数功能 |
---|---|
double fma (double x, double y, double z); |
计算x*y+z的值,并将结果四舍五入(double)。 |
float fmaf (float x, float y, float z ); |
计算x*y+z的值,并将结果四舍五入(float )。 |
long double fmal (long double x, long double y, long double z); |
计算x*y+z的值,并将结果四舍五入(double)。 |
1 |
|
函数声明 | 函数功能 |
---|---|
double fmax (double x, double y); |
获取 x 和 y 中的最大值(double) |
float fmaxf (float x, float y); |
获取 x 和 y 中的最大值(float) |
long double fmaxl (long double x, long double y); |
获取 x 和 y 中的最大值(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double fmin (double x, double y); |
获取 x 和 y 中的最小值(double) |
float fminf (float x, float y); |
获取 x 和 y 中的最小值(float) |
long double fminl (long double x, long double y); |
获取 x 和 y 中的最小值(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double fmod (double x, double y); |
计算 x 除以 y 的余数(double)。 |
float fmodf (float x, float y); |
计算 x 除以 y 的余数(float)。 |
long double fmodl (long double x, long double y); |
计算 x 除以 y 的余数(long double)。 |
1 |
|
函数声明 | 函数功能 |
---|---|
FILE *fopen(const char *filename, const char *mode); |
使用给定的模式mode打开filename所指向的文件。 |
参数:
返回值:
如果文件顺利打开后,指向该流的文件指针就会被返回;否则文件打开失败则返回 NULL,并把错误代码存在 error 中。
文件访问模式
文件访问模式 | 说明 |
---|---|
"r" |
以只读模式打开文件,该文件必须存在。 |
"w" |
以只写模式打开文件。若文件不存在则创建该文件。若文件存在则其现有内容将被清除。 |
"a" |
以追加模式打开只写文件。若文件不存在则创建该文件;如果文件存在,则新写入的数据会被加到文件尾后。 |
"r+" |
以读写模式打开文件,该文件必须存在。 |
"w+" |
以读写模式打开文件。若文件不存在则创建该文件。若文件存在则其内容将被清除。 |
"a+" |
以追加模式打开可读写文件。若文件不存在则创建该文件;如果文件存在,则新写入的数据会被加到文件尾后。 |
"rb" |
以只读模式打开一个二进制文件。 |
"wb" |
以只写模式打开或新建一个二进制文件。 |
"ab" |
以追加模式打开一个二进制文件,并在文件末尾写入数据。 |
"rb+" |
以读写模式打开一个二进制文件,该文件必须存在。 |
"wb+" |
以读写模式打开或创建一个二进制文件。 |
"ab+" |
以追加模式打开一个二进制文件,以便在文件末尾写入数据。该文件也是可读的。 |
"rt" |
以只读模式打开一个文本文件。 |
"wt" |
以只读模式打开或创建文本文件。 |
"at" |
以追加模式打开一个文本文件,并在文件末尾写入数据。 |
"rt+" |
以读写模式打开一个文本文件。 |
"wt+" |
以读写模式打开或创建文本文件。 |
"at+" |
以追加模式打开文本文件,以便在文件末尾写入数据。该文件也是可读的。 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fprintf(FILE *stream, char *format[, argument,...]); |
格式化输出到一个流文件中 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fputc(int ch, FILE *stream); |
将字符【ch为字符的ascii码】写到文件指针stream所指向的文件的当前写指针的位置 |
注意: 在正常调用情况下,函数返回写入文件的字符的 ASCII 码值,出错时,返回 EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。EOF是在头文件 stdio.h中定义的宏。
1 |
|
函数声明 | 函数功能 |
---|---|
int fputchar(char ch); |
送一个字符到标准输出流(stdout)中,出错则返回EOF |
1 |
|
函数声明 | 函数功能 |
---|---|
int fputs(const char *str, FILE *stream); |
把字符串写入到指定的流( stream) 中,但不包括空字符。 |
注意: fputs 函数如果成功则返回 0,如果发生错误则返回 EOF(-1)
1 |
|
函数声明 | 函数功能 |
---|---|
int fread(void *buffer, int size, int count, FILE *stream); |
从给定输入流stream读取最多count个对象到数组buffer中 |
参数:
返回值:
返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count。
若 size 或 count 为零,则 fread 返回零且不进行其他动作。
fread 不区分文件尾和错误,因此调用者必须用 feof 和 ferror 才能判断发生了什么。
注意: 如果读取成功,流的文件位置指示器前进读取的字节数;否则出现错误,则流的文件位置指示器的位置不确定。同样若没有完整地读入最后一个元素,则其值也不确定。
1 |
|
函数声明 | 函数功能 |
---|---|
void free(void *ptr); |
释放ptr指向的存储空间 |
注意: 被释放的空间通常被送入可用存储区池,以后可以在调用 malloc、realloc 以及 calloc 函数来再分配。
1 |
|
函数声明 | 函数功能 |
---|---|
FILE * freopen(const char *filename, const char *mode, FILE *stream); |
以指定模式重新指定到另一个文件 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
double frexp (double x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(double)。 |
float frexpf (float x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(float)。 |
long double frexpl (long double x, int * exp); |
将x 分解为有效位 和 2 的整数指数。(long double)。 |
注意: 有效位的绝对值范围为 0.5(包括) 到 1(不包括)。x = 有效位 * $2^{exp}$
1 |
|
函数声明 | 函数功能 |
---|---|
int fscanf(FILE *stream, char *format[,argument...]); |
从一个流中执行格式化输入 |
注意: fscanf 遇到空格和换行时结束。它与 fgets 有区别,fgets 遇到空格不结束。
1 |
|
函数声明 | 函数功能 |
---|---|
int fseek(FILE *stream, long offset, int fromwhere); |
重定位流上的文件指针位置 |
注意: 如果执行成功,stream 将指向以 fromwhere【偏移起始位置:文件头 **0(SEEK_SET)**,当前位置 1(SEEK_CUR),文件尾2(SEEK_END) 】为基准,偏移 offset(指针偏移量)个字节的位置。如果执行失败(比如 offset 超过文件自身大小),则不改变 stream 指向的位置。
1 |
|
函数声明 | 函数功能 |
---|---|
int fsetpos(FILE *stream, const fpos_t *pos); |
将文件指针定位在pos指定的位置上。如果成功返回0,否则返回非0。 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fstat(int handle,struct stat *buf); |
由文件描述符获取文件状态 |
1 |
|
函数声明 | 函数功能 |
---|---|
long ftell(FILE *stream); |
获取文件指针当前位置相对于文件首的偏移字节数 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fwrite(const void *ptr, int size, int nitems, FILE *stream); |
把ptr所指向的数组中的数据写入到给定流stream中 |
参数: |
注意: 如果写入成功,fwrite 返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nitems 参数不同,则会显示一个错误。
1 |
|
函数声明 | 函数功能 |
---|---|
double fabs(double x); |
返回 x 的绝对值(double) |
float fabsf(float x); |
返回 x 的绝对值(float) |
long double fabsl(long double x); |
返回 x 的绝对值(long double) |
int fclose(FILE *stream); |
关闭一个文件流 |
int fcloseall(void); |
关闭除标准流(stdin、stdout、stderr、stdprn、stdaux)之外的所有打开的流,刷新所有的流缓冲区,并返回关闭的流数。 |
char * fcvt(double value, int ndigit, int *decpt, int *sign); |
把一个双精度浮点数转换为字符串 |
double fdim (double x, double y); |
计算 x 和 y 之间的正差值 (double) |
float fdimf (float x, float y); |
计算 x 和 y 之间的正差值 (float) |
long double fdiml (long double x, long double y); |
计算 x 和 y 之间的正差值 (long double) |
FILE * fdopen(int handle, char *type); |
将文件描述符和文件流相关联 |
int feof(FILE *stream); |
检测流上的文件结束符。如果文件结束,则返回非0值,否则返回0 |
int ferror(FILE *stream); |
检测流上的错误【返回0,表示未出错;返回非零值,表示出错。】 |
int fflush(FILE *stream); |
清除读写缓冲区,并将缓冲区内的数据写回参数stream指向的文件中。 |
int fgetc(FILE *stream); |
从流中读取字符 |
int fgetchar(void); |
从流中读取字符 |
int fgetpos(FILE *stream); |
依据当前文件的句柄,获取当前访问指针位置信息 |
char * fgets(char *str, int n, FILE *stream); |
从指定的流中读取数据,每次读取一行 |
long filelength(int handle); |
获取文件的长度 |
int fileno(FILE *stream); |
获取参数stream指定的文件流所使用的文件描述符 |
void fillellipse(int x, int y, int xradius, int yradius); |
画出并填充一椭圆 |
void fillpoly(int numpoints, int *polypoints); |
画并填充一个多边形 |
int _findfirst(char *pathname, struct _finddata_t *_FindData); |
搜索与指定的文件名称匹配的第一个文件,若成功则返回第一个文件的文件描述符,否则返回-1L。 |
int _findnext(int handle, struct _finddata_t *_FindData); |
搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1 |
int finitef (double x); |
检查 x 是无穷大值还是NaN 值(double)。如果是无穷大值或NaN值,返回 0;否则返回 1。 |
int finitef (float x); |
检查 x 是无穷大值还是NaN 值(float)。如果是无穷大值或NaN值,返回 0;否则返回 1。 |
void floodfill(int x, int y, int border); |
填充一个有界区域 |
函数声明 | 函数功能 |
---|---|
double fabs(double x); |
返回 x 的绝对值(double) |
float fabsf(float x); |
返回 x 的绝对值(float) |
long double fabsl(long double x); |
返回 x 的绝对值(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
int fclose(FILE *stream); |
关闭一个文件流 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fcloseall(void); |
关闭除标准流(stdin、stdout、stderr、stdprn、stdaux)之外的所有打开的流,刷新所有的流缓冲区,并返回关闭的流数。 |
1 |
|
函数声明 | 函数功能 |
---|---|
char * fcvt(double value, int ndigit, int *decpt, int *sign); |
把一个双精度浮点数转换为字符串 |
1 |
|
函数声明 | 函数功能 |
---|---|
double fdim (double x, double y); |
计算 x 和 y 之间的正差值 (double) |
float fdimf (float x, float y); |
计算 x 和 y 之间的正差值 (float) |
long double fdiml (long double x, long double y); |
计算 x 和 y 之间的正差值 (long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
FILE * fdopen(int handle, char *type); |
将文件描述符和文件流相关联 |
1 |
|
函数声明 | 函数功能 |
---|---|
int feof(FILE *stream); |
检测流上的文件结束符。如果文件结束,则返回非0值,否则返回0 |
1 |
|
函数声明 | 函数功能 |
---|---|
int ferror(FILE *stream); |
检测流上的错误【返回0,表示未出错;返回非零值,表示出错。】 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fflush(FILE *stream); |
清除读写缓冲区,并将缓冲区内的数据写回参数stream指向的文件中。 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fgetc(FILE *stream); |
从流中读取字符 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fgetchar(void); |
从流中读取字符 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fgetpos(FILE *stream); |
依据当前文件的句柄,获取当前访问指针位置信息 |
1 |
|
函数声明 | 函数功能 |
---|---|
char * fgets(char *str, int n, FILE *stream); |
从指定的流中读取数据,每次读取一行 |
参数:
注意: 如果文件中的一行,不足 n-1 个字符,则读完该行就直接结束。如若该行(包括最后一个换行符)的字符数超过 n-1,则 fgets 只返回一个不完整的行,但是,缓冲区总是以 NULL 字符结尾,对 fgets 的下一次调用会继续读该行。函数成功将返回 stream,失败或读到文件结尾返回 NULL。因此不能直接通过 fgets 的返回值来判断函数是否是出错而终止的,应该借助 feof 函数或者 ferror 函数来判断。
1 |
|
函数声明 | 函数功能 |
---|---|
long filelength(int handle); |
获取文件的长度 |
1 |
|
函数声明 | 函数功能 |
---|---|
int fileno(FILE *stream); |
获取参数stream指定的文件流所使用的文件描述符 |
1 |
|
函数声明 | 函数功能 |
---|---|
void fillellipse(int x, int y, int xradius, int yradius); |
画出并填充一椭圆 |
参数:
int x
:椭圆中心点的x坐标。在二维图形环境中,x坐标通常表示水平方向上的位置,从左到右增加;int y
:椭圆中心点的y坐标。在二维图形环境中,y坐标通常表示垂直方向上的位置,从上到下增加;int xradius
:椭圆在x轴方向上的半径。它是从椭圆中心点到椭圆边缘在x轴方向上的最大距离。如果 xradius 较大,椭圆在水平方向上会显得更宽;int yradius
:椭圆在y轴方向上的半径。它是从椭圆中心点到椭圆边缘在y轴方向上的最大距离。如果 yradius 较大,椭圆在垂直方向上会显得更高。1 |
|
函数声明 | 函数功能 |
---|---|
void fillpoly(int numpoints, int *polypoints); |
画并填充一个多边形 |
参数:
numpoints
: 多边形边数polypoints
: 存储各顶点坐标的数组,每两个一组表示一个顶点的X,Y坐标1 |
|
函数声明 | 函数功能 |
---|---|
int _findfirst(char *pathname, struct _finddata_t *_FindData); |
搜索与指定的文件名称匹配的第一个文件,若成功则返回第一个文件的文件描述符,否则返回-1L。 |
int _findnext(int handle, struct _finddata_t *_FindData); |
搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1 |
_findfirst
参数:
char *pathname
:一个指向以 null
结尾的字符串的指针,该字符串指定了要搜索的文件名模式。文件名模式可以包含通配符,如 *
(匹配任意数量的字符)和 ?
(匹配单个字符)。例如,"*.txt"
会匹配所有以 .txt
为扩展名的文件。如果 pathname
字符串的最后一个字符是目录分隔符,那么函数将搜索该目录下的所有文件和子目录;如果 pathname
是一个空字符串,函数将搜索当前目录。struct _finddata_t *_FindData
:一个指向 _finddata_t
结构体的指针,该结构体用于接收关于找到的文件的信息。_finddata_t
结构体通常包含文件的属性(如是否只读、是否隐藏等)、创建时间、访问时间、修改时间、文件大小以及文件名等信息。调用 _findfirst
函数后, _FindData
指向的结构体将被填充为与文件名模式匹配的第一个文件的信息。如果搜索成功,_findfirst
函数将返回一个唯一的搜索句柄,这个句柄可以在后续的 _findnext
函数调用中使用,以查找与相同文件名模式匹配的其他文件。_findnext
参数:
int handle
:一个由 _findfirst
函数返回的搜索句柄。这个句柄标识了一个特定的文件搜索操作,该操作在调用 _findfirst
后开始。搜索句柄是一个唯一的标识符,用于后续调用 _findnext
来检索与原始搜索条件匹配的下一个文件或目录。struct _finddata_t *_FindData
:同上 _findfirst
的参数1 |
|
函数声明 | 函数功能 |
---|---|
int finitef (double x); |
检查 x 是无穷大值还是NaN 值(double)。如果是无穷大值或NaN值,返回 0;否则返回 1。 |
int finitef (float x); |
检查 x 是无穷大值还是NaN 值(float)。如果是无穷大值或NaN值,返回 0;否则返回 1。 |
1 |
|
函数声明 | 函数功能 |
---|---|
void floodfill(int x, int y, int border); |
填充一个有界区域 |
参数:
int x
:要开始填充的区域的起始点的 x 坐标;int y
:要开始填充的区域的起始点的 y 坐标;int border
:填充的边界颜色。泛洪填充算法会从起始点 (x, y) 开始,将所有相邻的、颜色与起始点相同的区域填充为新的颜色,直到遇到边界颜色 border 为止。这样,算法就不会越过由 border 颜色定义的边界,从而保证了填充区域的准确性。1 |
|
函数声明 | 函数功能 |
---|---|
char ecvt(double value, int ndigit, int *decpt, int *sign); |
把一个双精度浮点型数转换为字符串,转换结果中不包括十进制小数点 |
void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius); |
画一段椭圆线 |
int eof(int *handle); |
检测文件结束 |
int execl(const char *pathname, const char *arg0, ... const char *argn, NULL); |
载入并运行其它程序 |
int execlp(char *pathname, char *arg0, ... const char *argn, NULL); |
载入并运行其它程序 |
int execlpe(const char *pathname, const char *arg0, ... const char *argn, NULL, const char *const *envp); |
载入并运行其它程序 |
int execv(const char *pathname, char *const *argv); |
载入并运行其它程序 |
int execve(const char *pathname, char *const argv[], char *const envp[]); |
载入并运行其它程序 |
int execvp(const char *pathname, char *const argv[]); |
载入并运行其它程序 |
int execvpe(const char *pathname, char *const argv[], char *const envp[]); |
载入并运行其它程序 |
void exit(int status); |
终止程序 |
double exp(double x); |
计算 x 的基数e指数(double) |
float expf(float x); |
计算 x 的基数e指数(float) |
long double expl(long double x); |
计算 x 的基数e指数(long double) |
double exp2(double x); |
计算 x 的基数为2的指数(double) |
float exp2f(float x); |
计算 x 的基数为2的指数(float) |
long double exp2l(long double x); |
计算 x 的基数为2的指数(long double) |
double expm1 (double x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (double) |
float expm1f (float x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (float) |
long double expm1l (long double x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (long double) |
double erf (double x); |
计算 x 的 误差函数(double) |
float erff (float x); |
计算 x 的 误差函数(float) |
long double erfl (long double x); |
计算 x 的 误差函数(long double) |
double erfc (double x); |
计算 x 的互补误差函数(double) |
float erfcf (float x); |
计算 x 的互补误差函数(float) |
long double erfcl (long double x); |
计算 x 的互补误差函数(long double) |
函数声明 | 函数功能 |
---|---|
char ecvt(double value, int ndigit, int *decpt, int *sign); |
把一个双精度浮点型数转换为字符串,转换结果中不包括十进制小数点 |
1 |
|
函数声明 | 函数功能 |
---|---|
void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius); |
画一段椭圆线 |
以 (x, y) 为中心,xradius、yradius 为 x 轴 和 y 轴 半径,从角 stangle 开始,endangle 结束,画一段椭圆线。当stangle=0,endangle=360 时,画出一个完整的椭圆
1 |
|
函数声明 | 函数功能 |
---|---|
int eof(int *handle); |
检测文件结束 |
1 |
|
函数声明 | 函数功能 |
---|---|
int execl(const char *pathname, const char *arg0, ... const char *argn, NULL); |
载入并运行其它程序 |
注意: execl 函数,其后缀 l
代表 list,也就是参数列表的意思。第一个参数 path 字符指针指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]...
,最后一个参数须用空指针 NULL 作结束。
1 |
|
1 |
|
执行失败:
执行成功:
函数声明 | 函数功能 |
---|---|
int execle(const char *pathname, const char *arg0, ... const char *argn, NULL, const char *const *envp); |
载入并运行其它程序 |
注意: execl 函数是用来执行参数 path 字符串所代表的文件路径。接下来的参数代表执行该文件时传递过去的 argv[0], argv[1]…
,并且倒数第二个参数必须用空指针 NULL 作结束,最后一个参数为 环境变量。
1 |
|
1 |
|
函数声明 | 函数功能 |
---|---|
int execlp(char *pathname, char *arg0, ... const char *argn, NULL); |
载入并运行其它程序 |
注意: execlp 函数会从 PATH 环境变量所指的目录中查找符合参数 pathname 的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的arg0, arg1, …
,最后一个参数必须用 空指针 NULL 作结束。
1 |
|
函数声明 | 函数功能 |
---|---|
int execlpe(const char *pathname, const char *arg0, ... const char *argn, NULL, const char *const *envp); |
载入并运行其它程序 |
注意: execlp 函数会从 PATH 环境变量所指的目录中查找符合参数 pathname 的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的arg0, arg1, …
,其中倒数第二个参数必须用 空指针 NULL 作结束,最后一个参数为 环境变量。
参考 5.2.1 的 SubEnvTest.c
1 |
|
函数声明 | 函数功能 |
---|---|
int execv(const char *pathname, char *const *argv); |
载入并运行其它程序 |
注意:execv 函数用来运行參数 pathname 字符串所指向的程序,第二个参数 argv 为參数列表【该数组的最后一个元素必须是空指针 NULL】。
参考 4.2.1 的 SubTest.c
1 |
|
函数声明 | 函数功能 |
---|---|
int execve(const char *pathname, char *const argv[], char *const envp[]); |
载入并运行其它程序 |
注意:execve 函数用来运行參数 pathname 字符串所指向的程序,第二个参数 argv 为參数列表【该数组的最后一个元素必须是空指针 NULL】,最后一个参数为 环境变量。
参考 5.2.1 的 SubEnvTest.c
1 |
|
函数声明 | 函数功能 |
---|---|
int execvp(const char *pathname, char *const argv[]); |
载入并运行其它程序 |
注意:execvp 函会从 PATH 环境变量所指的目录中查找符合参数 pathname 的文件名,找到后便执行该文件,第二个参数 argv 为參数列表【该数组的最后一个元素必须是空指针 NULL】。
1 |
|
函数声明 | 函数功能 |
---|---|
int execvpe(const char *pathname, char *const argv[], char *const envp[]); |
载入并运行其它程序 |
注意:execvpe 函会从 PATH 环境变量所指的目录中查找符合参数 pathname 的文件名,找到后便执行该文件,第二个参数 argv 为參数列表【该数组的最后一个元素必须是空指针 NULL】,最后一个参数为 环境变量。
参考 5.2.1 的 SubEnvTest.c
1 |
|
函数声明 | 函数功能 |
---|---|
void exit(int status); |
终止程序 |
注意: exit 函数通常是用来终结程序用的,使用后程序自动结束,跳回操作系统。exit(0)
表示程序正常退出【相当于主函数 return 0;
】,exit⑴
表示程序异常退出【相当于主函数 return 1;
】。
1 |
|
函数声明 | 函数功能 |
---|---|
double exp(double x); |
计算 x 的基数e指数(double) |
float expf(float x); |
计算 x 的基数e指数(float) |
long double expl(long double x); |
计算 x 的基数e指数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double exp2(double x); |
计算 x 的基数为2的指数(double) |
float exp2f(float x); |
计算 x 的基数为2的指数(float) |
long double exp2l(long double x); |
计算 x 的基数为2的指数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double expm1 (double x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (double) |
float expm1f (float x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (float) |
long double expm1l (long double x); |
计算 e 的 x 次方 减 1,即 (e^x) - 1 (long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double erf (double x); |
计算 x 的 误差函数(double) |
float erff (float x); |
计算 x 的 误差函数(float) |
long double erfl (long double x); |
计算 x 的 误差函数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double erfc (double x); |
计算 x 的互补误差函数(double) |
float erfcf (float x); |
计算 x 的互补误差函数(float) |
long double erfcl (long double x); |
计算 x 的互补误差函数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
void detectgraph(int *graphdriver, int *graphmode); |
通过检测硬件确定图形驱动程序和模式 |
double difftime(time_t time2, time_t time1); |
计算两个时刻之间的时间差 |
void disable(void); |
屏蔽中断 |
div_t div(int number, int denom); |
将两个整数相除, 返回商和余数 |
void drawpoly(int numpoints, int *polypoints); |
画多边形 |
int dup(int handle); |
复制文件描述符;若成功为新的文件描述,若出错为-1 |
int dup2(int oldhandle, int newhandle); |
复制文件描述符;若成功为新的文件描述,若出错为-1。 |
函数声明 | 函数功能 |
---|---|
void detectgraph(int *graphdriver, int *graphmode); |
通过检测硬件确定图形驱动程序和模式 |
1 |
|
函数声明 | 函数功能 |
---|---|
double difftime(time_t time2, time_t time1); |
计算两个时刻之间的时间差 |
1 |
|
在上述的示例代码中,
time_t
类型的变量 first
和 second
;time(NULL)
函数获取当前的系统时间,并赋值给 first
;getchar()
函数等待用户输入,模拟延时的功能;time(NULL)
函数获取当前的系统时间,并赋值给 second
;difftime()
函数计算 first
和 second
之间的时间差【单位:秒】函数声明 | 函数功能 |
---|---|
void disable(void); |
屏蔽中断 |
1 | // 中断服务示例 |
注意: 这个程序可能无法在现代操作系统上直接运行,因为其中的一些函数(如disable()
、enable()
、getvect()
和 setvect()
)是特定于 DOS 的。如果你想在现代操作系统(如 Linux 或 Windows)上运行这个程序,你可能需要使用更现代的方法来处理中断或使用 DOS 模拟器。
函数声明 | 函数功能 |
---|---|
div_t div(int number, int denom); |
将两个整数相除, 返回商和余数 |
1 |
|
函数声明 | 函数功能 |
---|---|
void drawpoly(int numpoints, int *polypoints); |
画多边形 |
参数说明:
numpoints
:多边形顶点的数量
polypoints
:一个整数数组,包含多边形的各个顶点的坐标。
1 |
|
函数声明 | 函数功能 |
---|---|
int dup(int handle); |
复制文件描述符;若成功为新的文件描述,若出错为-1 |
dup 返回的新文件描述符一定是当前可用文件描述中的最小数值。
1 |
|
上述代码可以简单总结如下:
"STU.FIL"
的文件,并以写入模式打开。"This is a test"
写入该文件。"temp.txt"
的文件,并获取其文件句柄。"STU.FIL"
文件。flush
函数来刷新文件缓冲区。fflush
函数来刷新传入的文件流的缓冲区;dup
函数复制文件描述符,并将其存储在duphandle
变量中;函数声明 | 函数功能 |
---|---|
int dup2(int oldhandle, int newhandle); |
复制文件描述符;若成功为新的文件描述,若出错为-1。 |
dup2 可以用 newhandle 参数指定新的描述符数值。如果 newhandle 已经打开,则先关闭。若 oldhandle = newhandle,则 dup2 返回 newhandle,而不关闭它。
1 |
|
上述代码简单分析如下:
STDOUT
,其值为 1,表示标准输出的文件描述符;handle
和 oldstdout
,以及字符数组 msg
,用于存储要写入文件的字符串;open
函数打开名为 "STU.FIL"
的文件,以创建和读写模式(O_CREAT | O_RDWR
)打开,并设置文件权限为可读可写(S_IREAD | S_IWRITE
);将返回的文件描述符赋值给 handle
,并打印出来;dup
函数备份当前的标准输出(STDOUT
),将备份的文件描述符赋值给 oldstdout
,并打印出来;dup2
函数将标准输出重定向到 handle
指向的文件,即将后续的输出内容写入到 "STU.FIL"
文件中;handle
指向的文件句柄;write
函数将 msg
字符串写入到标准输出(此时已经重定向到文件),长度为字符串的长度;dup2
函数将标准输出恢复到备份的文件描述符 oldstdout
,即将后续的输出内容输出到屏幕上。oldstdout
指向的文件句柄。