C语言教程 第17页 C 库函数 – fclose() C 标准库 – <stdio.h> 描述 C 库函数 int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。 声明 下面是 fclose() 函数的声明。 int fclose(FILE *stream) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。 返回值 如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。 实例 下面的实例演示了 fclose() 函数的用法。 #include <stdio.h> int main() { FILE *fp; fp = fopen("file.txt", "w"); fprintf(fp, "%s", "这里是 w3cschool.cn"); fclose(fp); return(0); } 让我们编译并运行上面的程序,这将创建一个文件 file.txt,然后写入下面的文本行,最后使用 fclose() 函数关闭文件。 这里是 w3cschool.cn C 标准库 – <stdio.h>
2024-04-03
C 库函数 – fsetpos() C 标准库 – <stdio.h> 描述 C 库函数 int fsetpos(FILE *stream, const fpos_t *pos) 设置给定流 stream 的文件位置为给定的位置。参数 pos 是由函数 fgetpos 给定的位置。 声明 下面是 fsetpos() 函数的声明。 int fsetpos(FILE *stream, const fpos_t *pos) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了流。 pos — 这是指向 fpos_t 对象的指针,该对象包含了之前通过 fgetpos 获得的位置。 返回值 如果成功,该函数返回零值,否则返回非零值,并设置全局变量 errno 为一个正值,该值可通过 perror 来解释。 实例 下面的实例演示了 fsetpos() 函数的用法。 #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; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c",...
2024-04-03
C 库函数 – fprintf() C 标准库 – <stdio.h> 描述 C 库函数 int fprintf(FILE *stream, const char *format, …) 发送格式化输出到流 stream 中。 声明 下面是 fprintf() 函数的声明。 int fprintf(FILE *stream, const char *format, ...) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了流。 format — 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下: specifier(说明符) 输出 c 字符 d 或 i 有符号十进制整数 e 使用 e 字符的科学科学记数法(尾数和指数) E 使用 E 字符的科学科学记数法(尾数和指数) f 十进制浮点数 g 自动选择 %e 或 %f 中合适的表示法 G 自动选择 %E 或 %f 中合适的表示法 o 有符号八进制 s 字符的字符串 u 无符号十进制整数 x 无符号十六进制整数 X 无符号十六进制整数(大写字母) p 指针地址 n 无输出 % 字符 flags(标识) 描述 – 在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。 + 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 – 号。 (space) 如果没有写入任何符号,则在该值前面插入一个空格。 # 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示...
2024-04-03
C 库宏 – va_end() C 标准库 – <stdarg.h> 描述 C 库宏 void va_end(va_list ap) 允许使用了 va_start 宏的带有可变参数的函数返回。如果在从函数返回之前没有调用 va_end,则结果为未定义。 声明 下面是 va_end() 宏的声明。 void va_end(va_list ap) 参数 ap — 这是之前由同一函数中的 va_start 初始化的 va_list 对象。 返回值 该宏不返回任何值。 实例 下面的实例演示了 va_end() 宏的用法。 #include <stdarg.h> #include <stdio.h> int mul(int, ...); int main() { printf("15 * 12 = %d\n", mul(2, 15, 12) ); return 0; } int mul(int num_args, ...) { int val = 1; 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 * 12 = 180 C 标准库 – <stdarg.h>
2024-04-03
C 库函数 – fread() C 标准库 – <stdio.h> 描述 C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。 声明 下面是 fread() 函数的声明。 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 参数 ptr — 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。 size — 这是要读取的每个元素的大小,以字节为单位。 nmemb — 这是元素的个数,每个元素的大小为 size 字节。 stream — 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。 返回值 成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。 实例 下面的实例演示了 fread() 函数的用法。 #include <stdio.h> #include <string.h> int main() { FILE *fp; char c[] = "This is w3cschool"; char buffer[20]; /* 打开文件用于读写 */ fp = fopen("file.txt", "w+"); /* 写入数据到文件 */ fwrite(c, strlen(c) + 1, 1, fp); /* 查找文件的开头 */ fseek(fp, SEEK_SET, 0); /* 读取并显示数据 */ fread(buffer, strlen(c)+1, 1, fp); printf("%s\n", buffer); fclose(fp); return(0);...
2024-04-03
C 库函数 – setvbuf() C 标准库 – <stdio.h> 描述 C 库函数 int setvbuf(FILE *stream, char *buffer, int mode, size_t size) 定义流 stream 应如何缓冲。 声明 下面是 setvbuf() 函数的声明。 int setvbuf(FILE *stream, char *buffer, int mode, size_t size) 参数 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。 buffer — 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。 mode — 这指定了文件缓冲的模式: 模式 描述 _IOFBF 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。 _IOLBF 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。 _IONBF 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。 size –这是缓冲的大小,以字节为单位。 返回值 如果成功,则该函数返回 0,否则返回非零值。 实例 下面的实例演示了 setvbuf() 函数的用法。 #include <stdio.h> int main() { char buff[1024]; memset( buff, '\0', sizeof( buff )); fprintf(stdout, "启用全缓冲\n"); setvbuf(stdout, buff, _IOFBF, 1024); fprintf(stdout, "这里是 w3cschool.cn\n"); fprintf(stdout, "该输出将保存到 buff\n"); fflush( stdout ); fprintf(stdout, "这将在编程时出现\n"); fprintf(stdout, "最后休眠五秒钟\n"); sleep(5); return(0); } 让我们编译并运行上面的程序,这将产生以下结果。在这里,程序把缓冲输出保存到 buff,直到首次调用 fflush() 为止,然后开始缓冲输出,最后休眠 5 秒钟。它会在程序结束之前,发送剩余的输出到 STDOUT。 启用全缓冲 这里是 w3cschool.cn 该输出将保存到 buff...
2024-04-03
C 库宏 – NULL C 标准库 – <stddef.h> 描述 C 库宏 NULL 是一个空指针常量的值。它可以被定义为 ((void*)0), 0 或 0L,这取决于编译器供应商。 声明 下面是取决于编译器的 NULL 宏的声明。 #define NULL ((char *)0) 或 #define NULL 0L 或 #define NULL 0 参数 NA 返回值 NA 实例 下面的实例演示了 NULL 宏的用法。 #include <stddef.h> #include <stdio.h> int main () { FILE *fp; fp = fopen("file.txt", "r"); if( fp != NULL ) { printf("成功打开文件 file.txt\n"); fclose(fp); } fp = fopen("nofile.txt", "r"); if( fp == NULL ) { printf("不能打开文件 nofile.txt\n"); } return(0); } 假设文件 file.txt 已存在,但是 nofile.txt 不存在。让我们编译并运行上面的程序,这将产生以下结果: 成功打开文件 file.txt 不能打开文件 nofile.txt C 标准库 – <stddef.h>
2024-04-03
C 库函数 – freopen() C 标准库 – <stdio.h> 描述 C 库函数 FILE *freopen(const char *filename, const char *mode, FILE *stream) 把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件。 声明 下面是 freopen() 函数的声明。 FILE *freopen(const char *filename, const char *mode, FILE *stream) 参数 filename — 这是 C 字符串,包含了要打开的文件名称。 mode — 这是 C 字符串,包含了文件访问模式,模式如下: 模式 描述 “r” 打开一个用于读取的文件。该文件必须存在。 “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 “w+” 创建一个用于读写的空文件。 “a+” 打开一个用于读取和追加的文件。 stream — 这是指向 FILE 对象的指针,该 FILE 对象标识了要被重新打开的流。 返回值 如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。否则,返回空指针。 实例 下面的实例演示了 freopen() 函数的用法。 #include <stdio.h> int main () { FILE *fp; printf("该文本重定向到 stdout\n"); fp = freopen("file.txt", "w+", stdout); printf("该文本重定向到 file.txt\n"); fclose(fp); return(0); } 让我们编译并运行上面的程序,这将发送下列行到标准输出 STDOUT,因为起初我们并没有打开标准输出: 该文本重定向到 stdout 在调用 freopen() 之后,它会关联标准输出 STDOUT 到文件 file.txt,无论我们在标准输出 STDOUT 中写了什么都会被写入 file.txt,所以文件 file.txt 将有以下内容。 该文本重定向到 file.txt 现在让我们使用下面的程序查看上面文件的内容: #include <stdio.h> int main () {...
2024-04-03
C 库函数 – tmpfile() C 标准库 – <stdio.h> 描述 C 库函数 FILE *tmpfile(void) 以二进制更新模式(wb+)创建临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除。 声明 下面是 tmpfile() 函数的声明。 FILE *tmpfile(void) 参数 NA 返回值 如果成功,该函数返回一个指向被创建的临时文件的流指针。如果文件未被创建,则返回 NULL。 实例 下面的实例演示了 tmpfile() 函数的用法。 #include <stdio.h> int main () { FILE *fp; fp = tmpfile(); printf("临时文件被创建\n"); /* 您可以在这里使用临时文件 */ fclose(fp); return(0); } 让我们编译并运行上面的程序,它将在 /tmp 文件夹中创建一个临时文件,但是一旦程序退出,临时文件会被自动删除,且程序会产生以下结果: 临时文件被创建 C 标准库 – <stdio.h>
2024-04-03
C 库宏 – va_start() C 标准库 – <stdarg.h> 描述 C 库宏 void va_start(va_list ap, last_arg) 初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。 这个宏必须在使用 va_arg 和 va_end 之前被调用。 声明 下面是 va_start() 宏的声明。 void va_start(va_list ap, last_arg); 参数 ap — 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息。 last_arg — 最后一个传递给函数的已知的固定参数。 返回值 NA 实例 下面的实例演示了 va_start() 宏的用法。 #include<stdarg.h> #include<stdio.h> int sum(int, ...); int main(void) { printf("10、20 和 30 的和 = %d\n", sum(3, 10, 20, 30) ); printf("4、20、25 和 30 的和 = %d\n", sum(4, 4, 20, 25, 30) ); 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; } 让我们编译并运行上面的程序,这将产生以下结果:...
2024-04-03