C语言教程 第18页
C 库函数 – fgetpos() C 标准库 – <stdio.h> 描述 C 库函数 int fgetpos(FILE *stream, fpos_t *pos) 获取流 stream 的当前文件位置,并把它写入到 pos。 声明 下面是 fgetpos() 函数的声明。 int fgetpos(FILE *stream, fpos_t *pos) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了流。 pos — 这是指向 fpos_t 对象的指针。 返回值 如果成功,该函数返回零。如果发生错误,则返回非零值。 实例 下面的实例演示了 fgetpos() 函数的用法。 #include <stdio.h> int main () { FILE *fp; fpos_t position; fp = fopen("file.txt","w+"); fgetpos(fp, &position); fputs("Hello, World!", fp); fsetpos(fp, &position); fputs("这将覆盖之前的内容", fp); fclose(fp); return(0); } 让我们编译并运行上面的程序,这将创建一个文件 file.txt,它的内容如下。首先我们使用 fgetpos() 函数获取文件的初始位置,接着我们向文件写入 Hello, World!,然后我们使用 fsetpos() 函数来重置写指针到文件的开头,重写文件为下列内容: 这将覆盖之前的内容 现在让我们使用下面的程序查看上面文件的内容: #include <stdio.h> int main () { FILE *fp; int c; int n = 0; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c", c); } fclose(fp); return(0); } C 标准库...
C 库宏 – va_arg() C 标准库 – <stdarg.h> 描述 C 库宏 type va_arg(va_list ap, type) 检索函数参数列表中类型为 type 的下一个参数。它无法判断检索到的参数是否是传给函数的最后一个参数。 声明 下面是 va_arg() 宏的声明。 type va_arg(va_list ap, type) 参数 ap — 这是一个 va_list 类型的对象,存储了有关额外参数和检索状态的信息。该对象应在第一次调用 va_arg 之前通过调用 va_start 进行初始化。 type — 这是一个类型名称。该类型名称是作为扩展自该宏的表达式的类型来使用的。 返回值 该宏返回下一个额外的参数,是一个类型为 type 的表达式。 实例 下面的实例演示了 va_arg() 宏的用法。 #include <stdarg.h> #include <stdio.h> int sum(int, ...); int main() { printf("15 和 56 的和 = %d\n", sum(2, 15, 56) ); return 0; } int sum(int num_args, ...) { int val = 0; va_list ap; int i; va_start(ap, num_args); for(i = 0; i < num_args; i++) { val += va_arg(ap, int); } va_end(ap); return val; } 让我们编译并运行上面的程序,这将产生以下结果: 15 和 56 的和 = 71 C 标准库 – <stdarg.h>
C 库函数 – fopen() C 标准库 – <stdio.h> 描述 C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。 声明 下面是 fopen() 函数的声明。 FILE *fopen(const char *filename, const char *mode) 参数 filename — 这是 C 字符串,包含了要打开的文件名称。 mode — 这是 C 字符串,包含了文件访问模式,模式如下: 模式 描述 “r” 打开一个用于读取的文件。该文件必须存在。 “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 “w+” 创建一个用于读写的空文件。 “a+” 打开一个用于读取和追加的文件。 返回值 该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。 实例 下面的实例演示了 fopen() 函数的用法。 #include <stdio.h> #include <stdlib.h> int main() { FILE * fp; fp = fopen ("file.txt", "w+"); fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014); fclose(fp); return(0); } 让我们编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt: We are in 2014 现在让我们使用下面的程序查看上面文件的内容: #include <stdio.h> int main () { FILE *fp; int c; fp = fopen("file.txt","r"); while(1) { c...
C 库函数 – setbuf() C 标准库 – <stdio.h> 描述 C 库函数 void setbuf(FILE *stream, char *buffer) 定义流 stream 应如何缓冲。该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。 声明 下面是 setbuf() 函数的声明。 void setbuf(FILE *stream, char *buffer) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。 buffer — 这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度。 返回值 该函数不返回任何值。 实例 下面的实例演示了 setbuf() 函数的用法。 #include <stdio.h> int main() { char buf[BUFSIZ]; setbuf(stdout, buf); puts("This is w3cschool"); fflush(stdout); return(0); } 让我们编译并运行上面的程序,这将产生以下结果。在这里,程序在即将输出的时候,发送输出到 STDOUT,否则它将缓冲输出。您也可以使用 fflush() 函数来 to 刷新输出。 This is w3cschool C 标准库 – <stdio.h>
C 库函数 – signal() C 标准库 – <signal.h> 描述 C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。 声明 下面是 signal() 函数的声明。 void (*signal(int sig, void (*func)(int)))(int) 参数 sig — 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量: 宏 信号 SIGABRT (Signal Abort) 程序异常终止。 SIGFPE (Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。 SIGILL (Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。 SIGINT (Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。 SIGSEGV (Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。 SIGTERM (Signal Terminate) 发送给本程序的终止请求信号。 func — 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一: SIG_DFL 默认的信号处理程序。 SIG_IGN 忽视信号。 返回值 该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR。 实例 下面的实例演示了 signal() 函数的用法。 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void sighandler(int); int main() { signal(SIGINT, sighandler); while(1) { printf("开始休眠一秒钟...\n"); sleep(1); } return(0); } void sighandler(int signum) { printf("捕获信号 %d,跳出...\n", signum); exit(1); } 让我们编译并运行上面的程序,这将产生以下结果,且程序会进入无限循环,需使用 CTRL + C 键跳出程序。 开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 捕获信号...
C 库函数 – modf() C 标准库 – <math.h> 描述 C 库函数 double modf(double x, double *integer) 返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。 声明 下面是 modf() 函数的声明。 double modf(double x, double *integer) 参数 x — 浮点值。 integer — 指向一个对象的指针,该对象存储了整数部分。 返回值 该函数返回 x 的小数部分,符号与 x 相同。 实例 下面的实例演示了 modf() 函数的用法。 #include<stdio.h> #include<math.h> int main () { double x, fractpart, intpart; x = 8.123456; fractpart = modf(x, &intpart); printf("整数部分 = %lf\n", intpart); printf("小数部分 = %lf \n", fractpart); return(0); } 让我们编译并运行上面的程序,这将产生以下结果: 整数部分 = 8.000000 小数部分 = 0.123456 C 标准库 – <math.h>
C 库函数 – raise() C 标准库 – <signal.h> 描述 C 库函数 int raise(int sig) 会促使生成信号 sig。sig 参数与 SIG 宏兼容。 声明 下面是 raise() 函数的声明。 int raise(int sig) 参数 sig — 要发送的信号码。下面是一些重要的标准信号常量: 宏 信号 SIGABRT (Signal Abort) 程序异常终止。 SIGFPE (Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。 SIGILL (Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。 SIGINT (Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。 SIGSEGV (Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。 SIGTERM (Signal Terminate) 发送给本程序的终止请求信号。 返回值 如果成功该函数返回零,否则返回非零。 实例 下面的实例演示了 raise() 函数的用法。 #include <signal.h> #include <stdio.h> void signal_catchfunc(int); int main() { int ret; ret = signal(SIGINT, signal_catchfunc); if( ret == SIG_ERR) { printf("错误:不能设置信号处理程序。\n"); exit(0); } printf("开始生成一个信号\n"); ret = raise(SIGINT); if( ret !=0 ) { printf("错误:不能生成 SIGINT 信号。\n"); exit(0); } printf("退出...\n"); return(0); } void signal_catchfunc(int signal) { printf("!! 信号捕获 !!\n"); } 让我们编译并运行上面的程序,这将产生以下结果: 开始生成一个信号 !! 信号捕获...
C 库函数 – ldexp() C 标准库 – <math.h> 描述 C 库函数 double ldexp(double x, int exponent) 返回 x 乘以 2 的 exponent 次幂。 声明 下面是 ldexp() 函数的声明。 double ldexp(double x, int exponent) 参数 x — 代表有效位数的浮点值。 exponent — 指数的值。 返回值 该函数返回 x * 2 exp。 实例 下面的实例演示了 ldexp() 函数的用法。 #include <stdio.h> #include <math.h> int main () { double x, ret; int n; x = 0.65; n = 3; ret = ldexp(x ,n); printf("%f * 2^%d = %f\n", x, n, ret); return(0); } 让我们编译并运行上面的程序,这将产生以下结果: 0.650000 * 2^3 = 5.200000 C 标准库 – <math.h>
C 库宏 – setjmp() C 标准库 – <setjmp.h> 描述 C 库宏 int setjmp(jmp_buf environment) 把当前环境保存在变量 environment 中,以便函数 longjmp() 后续使用。如果这个宏直接从宏调用中返回,则它会返回零,但是如果它从 longjmp() 函数调用中返回,则它会返回一个传给 longjmp 作为第二个参数的非零值。 声明 下面是 setjmp() 宏的声明。 int setjmp(jmp_buf environment) 参数 environment — 这是一个类型为 jmp_buf 的用于存储环境信息的对象。 返回值 这个宏可能不只返回一次。第一次,在直接调用它时,它总是返回零。当调用 longjmp 时带有设置的环境信息,这个宏会再次返回,此时它返回的值会传给 longjmp 作为第二个参数。 实例 下面的实例演示了 setjmp() 宏的用法。 #include <stdio.h> #include <stdlib.h> #include <setjmp.h> int main() { int val; jmp_buf env_buffer; /* 保存 longjmp 的调用环境 */ val = setjmp( env_buffer ); if( val != 0 ) { printf("从 longjmp() 返回值 = %s\n", val); exit(0); } printf("跳转函数调用\n"); jmpfunction( env_buffer ); return(0); } void jmpfunction(jmp_buf env_buf) { longjmp(env_buf, "w3cschool.cn"); } 让我们编译并运行上面的程序,这将产生以下结果: 跳转函数调用 从 longjmp() 返回值 = w3cschool.cn C 标准库 – <setjmp.h>
C 库函数 – log() C 标准库 – <math.h> 描述 C 库函数 double log(double x) 返回 x 的自然对数(基数为 e 的对数)。 声明 下面是 log() 函数的声明。 double log(double x) 参数 x — 浮点值。 返回值 该函数返回 x 的自然对数。 实例 下面的实例演示了 log() 函数的用法。 #include <stdio.h> #include <math.h> int main () { double x, ret; x = 2.7; /* 计算 log(2.7) */ ret = log(x); printf("log(%lf) = %lf", x, ret); return(0); } 让我们编译并运行上面的程序,这将产生以下结果: log(2.700000) = 0.993252 C 标准库 – <math.h>