【Spring Boot 源码学习】@SpringBootApplication 注解

引言

在 Huazie 前面的博文 《Spring Boot 核心运行原理介绍》中,我们初步了解了 Spring Boot 核心运行原理,知道了 @EnableAutoConfiguration 是用来开启自动配置的注解。但创建过 Spring Boot 项目的读者肯定会说,我们并没有直接看到这个注解,实际上前面我也提到,它是由组合注解 @SpringBootApplication 引入的。

Read More

C语言函数大全--g开头的函数(上)

总览

函数声明 函数功能
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坐标

1. gcvt

1.1 函数说明

函数声明 函数功能
char *gcvt(double value, int ndigit, char *buf); 把浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针的函数。

参数:
value: 被转换的值。
ndigit: 存储的有效数字位数。
buf: 结果的存储位置。

注意: gcvt 函数把一个浮点值转换成一个字符串 (包括一个小数点和可能的符号字节) 并存储该字符串在 buffer 中。该 buffer 应足够大以便容纳转换的值加上结尾的 结束符 '\0',它是自动添加的。
如果一个缓冲区的大小为 ndigit + 1,则 gcvt 函数将覆盖该缓冲区的末尾。这是因为转换的字符串包括一个小数点以及可能包含符号和指数信息。

1.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
char str[25];
double num;
int sig = 5;

num = 1.23;
gcvt(num, sig, str);
printf("string = %s\n", str);

num = -456.78912;
gcvt(num, sig, str);
printf("string = %s\n", str);

num = 0.345e5;
gcvt(num, sig, str);
printf("string = %s\n", str);

return(0);
}

1.3 运行结果

2. getarccoords

2.1 函数说明

函数声明 函数功能
void getarccoords(struct arccoordstype *arccoords); 取最后一次调用arc的坐标

2.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main()
{
int gdriver = DETECT, gmode, errorcode;
struct arccoordstype arcinfo;
int midx, midy;
int stangle = 45, endangle = 270;
char sstr[80], estr[80];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

setcolor(getmaxcolor());
arc(midx, midy, stangle, endangle, 100);
// 取最后一次调用arc的坐标
getarccoords(&arcinfo);

sprintf(sstr, "*- (%d, %d)", arcinfo.xstart, arcinfo.ystart);
sprintf(estr, "*- (%d, %d)", arcinfo.xend, arcinfo.yend);

outtextxy(arcinfo.xstart, arcinfo.ystart, sstr);
outtextxy(arcinfo.xend, arcinfo.yend, estr);

getch();
closegraph();
return 0;
}

上述代码是一个简单的图形程序,使用了图形库函数 arc 来绘制一个弧线并显示其起始和结束点的坐标。

大致逻辑如下:

  1. 初始化图形驱动和模式,创建一个空的图形窗口。
  2. 检查图形操作是否成功,如果失败则输出错误信息并退出程序。
  3. 计算屏幕的中心点坐标 (midx, midy)
  4. 设置绘图颜色为最大颜色值。
  5. 在屏幕中心绘制一个弧线,起始角度为 45 度,结束角度为 270 度,半径为 100 像素。
  6. 获取最后一次调用 arc 函数时的坐标信息,并将其存储在 arcinfo 结构体中。
  7. 使用 sprintf 函数将起始点和结束点的坐标格式化为字符串。
  8. 在屏幕上显示起始点和结束点的坐标信息。
  9. 等待用户按键输入,然后关闭图形窗口并退出程序。

2.3 运行结果

3. getbkcolor

3.1 函数说明

函数声明 函数功能
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

3.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <graphics.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int bkcolor, midx, midy;
char bkname[35];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;
setcolor(getmaxcolor());

settextjustify(CENTER_TEXT, CENTER_TEXT);
cleardevice();

for (int i = WHITE; i >= 0; i--)
{
setbkcolor(i);
bkcolor = getbkcolor(); // 获取当前背景颜色
if (i == WHITE) setcolor(BLACK);
else setcolor(WHITE);
itoa(bkcolor, bkname, 10);
strcat(bkname," is the current background color.");

outtextxy(midx, midy, bkname);
getch();
cleardevice();
}

getch();
closegraph();
return 0;
}

上述也是一个简单的图形程序,通过使用图形库来绘制背景颜色变化。

下面来简单总结下:

  1. 初始化图形驱动和模式,创建一个空的图形窗口。
  2. 检查图形操作是否成功,如果失败则输出错误信息并退出程序。
  3. 计算屏幕的中心点坐标 (midx, midy)
  4. 设置绘图颜色为最大颜色值。
  5. 设置文本对齐方式为中心对齐。
  6. 清空设备上的图形内容。
  7. 循环遍历从白色到黑色的背景颜色,每次循环执行以下操作:
  • 设置当前背景颜色为循环变量 i 所代表的颜色。
  • 获取当前背景颜色并将其转换为字符串形式存储在 bkcolor 数组中。
  • 如果当前颜色是白色,则设置文本颜色为黑色;否则设置为白色。
  • 将背景颜色信息添加到 bkname 字符串中。
  • 在屏幕中心位置显示包含背景颜色信息的文本。
  • 等待用户按键输入,然后清空设备上的图形内容。
  1. 等待用户按键输入,然后关闭图形窗口并退出程序。

3.3 运行结果

4. getc

4.1 函数说明

函数声明 函数功能
int getc(FILE *stream); 从流中取字符

4.2 演示示例

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
char ch;
printf("Input a character:");
ch = getc(stdin);
printf("The character input was: '%c'\n", ch);
return 0;
}

4.3 运行结果

5. getchar

5.1 函数说明

函数声明 函数功能
int getchar(void); stdin 流中读字符

5.2 演示示例

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void)
{
int c;
while ((c = getchar()) != '\n')
printf("%c ", c);

return 0;
}

5.3 运行结果

6. getcolor

6.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

6.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <graphics.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int color, midx, midy;
char colname[35];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
/* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;
setcolor(getmaxcolor());

settextjustify(CENTER_TEXT, CENTER_TEXT);

for (int i = WHITE; i > 0; i--)
{
color = getcolor();
itoa(color, colname, 10);
strcat(colname, " is the current drawing color.");
outtextxy(midx, midy, colname);
getch();
cleardevice();
setcolor(i - 1);
}

getch();
closegraph();
return 0;
}

上述程序,通过使用图形库,在一个循环中遍历所有颜色,每次在屏幕中心显示当前颜色的名称和值,等待用户按键后更改颜色并清除屏幕,直到所有颜色展示完毕。

6.3 运行结果

7. getcwd

7.1 函数说明

函数声明 函数功能
char *getcwd(char *buffer, int maxlen); 获取当前工作目录

注意:getcwd 函数是将当前工作目录的绝对路径复制到参数 buffer 所指的内存空间中,参数 maxlenbuffer 的空间大小。

7.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <dir.h>

#define MAXPATH 1000

int main()
{
char buffer[MAXPATH];
getcwd(buffer, MAXPATH);
printf("The current directory is: %s\n", buffer);
return 0;
}

7.3 运行结果

8. getdefaultpalette

8.1 函数说明

函数声明 函数功能
struct palettetype* getdefaultpalette(void); 获取调色板定义结构

8.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int i, midx, midy;;

struct palettetype far *pal=NULL;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 3;
midy = getmaxy() / 2;
setcolor(getmaxcolor());
// 获取调色板定义结构
pal = getdefaultpalette();

char buffer[100];
for (i=BLACK; i<WHITE + 1; i++)
{
sprintf(buffer, "colors[%d] = %d", i, pal->colors[i]);
outtextxy(midx, midy, buffer);
getch();
cleardevice();
}

getch();
closegraph();
return 0;
}

8.3 运行结果

9. getdrivername

9.1 函数说明

函数声明 函数功能
char *getdrivename(void); 获取当前图形驱动程序名字

9.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
char *drivername;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

setcolor(getmaxcolor());

// 当前图形驱动程序名字
drivername = getdrivername();

settextjustify(CENTER_TEXT, CENTER_TEXT);

outtextxy(getmaxx() / 2, getmaxy() / 2, drivername);

getch();
closegraph();
return 0;
}

9.3 运行结果

10. getfillpattern

10.1 函数说明

函数声明 函数功能
void getfillpattern(char *upattern); 将用户定义的填充模式拷贝到内存中

10.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <graphics.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int maxx, maxy;
char pattern[8] = {0x00, 0x70, 0x20, 0x27, 0x25, 0x27, 0x04, 0x04};

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

maxx = getmaxx();
maxy = getmaxy();
setcolor(getmaxcolor());
// 选择用户定义的填充模式
setfillpattern(pattern, getmaxcolor());

bar(0, 0, maxx, maxy);

getch();
// 将用户定义的填充模式拷贝到内存中
getfillpattern(pattern);

pattern[0] += 1;
pattern[1] -= 2;
pattern[2] += 3;
pattern[3] -= 4;
pattern[4] += 5;
pattern[5] -= 6;
pattern[6] += 7;
pattern[7] -= 8;
// 选择用户定义的填充模式
setfillpattern(pattern, getmaxcolor());

bar(0, 0, maxx, maxy);

getch();
closegraph();
return 0;
}

10.3 运行结果

11. getfillsettings

11.1 函数说明

函数声明 函数功能
void getfillsettings(struct fillsettingstype *fillinfo); 获取有关当前填充模式和填充颜色的信息

11.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

// the names of the fill styles supported
char *fname[] = { "EMPTY_FILL",
"SOLID_FILL",
"LINE_FILL",
"LTSLASH_FILL",
"SLASH_FILL",
"BKSLASH_FILL",
"LTBKSLASH_FILL",
"HATCH_FILL",
"XHATCH_FILL",
"INTERLEAVE_FILL",
"WIDE_DOT_FILL",
"CLOSE_DOT_FILL",
"USER_FILL"
};

int main()
{
int gdriver = DETECT, gmode, errorcode;
struct fillsettingstype fillinfo;
int midx, midy;
char patstr[40], colstr[40];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

// 获取有关当前填充模式和填充颜色的信息
getfillsettings(&fillinfo);

sprintf(patstr, "%s is the fill style.", fname[fillinfo.pattern]);
sprintf(colstr, "%d is the fill color.", fillinfo.color);

settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(midx, midy, patstr);
outtextxy(midx, midy+2*textheight("W"), colstr);

getch();
closegraph();
return 0;
}

11.3 运行结果

12. getgraphmode

12.1 函数说明

函数声明 函数功能
int getgraphmode(void); 获取当前图形模式

12.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <graphics.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int midx, midy, mode;
char numname[80], modename[80];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

// 获取当前图形模式
mode = getgraphmode();
sprintf(numname, "%d is the current mode number.", mode);
sprintf(modename, "%s is the current graphics mode", getmodename(mode));

settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(midx, midy, numname);
outtextxy(midx, midy+2*textheight("W"), modename);

getch();
closegraph();
return 0;
}

12.3 运行结果

13. getimage

13.1 函数说明

函数声明 函数功能
void getimage(int left, int top, int right, int bottom, void *bitmap); 保存指定区域的屏幕上的像素图形到指定的内存区域

13.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<graphics.h>
int main()
{
int driver,mode;
unsigned size;
void *buf;

driver=DETECT;
mode=0; initgraph(&driver,&mode,"");

setcolor(15);
rectangle(20,20,200,200);

setcolor(RED);
line(20,20,200,200);

setcolor(GREEN);
line(20,200,200,20);

getch();

size=imagesize(20,20,200,200);
if(size!=-1)
{
buf=malloc(size);
if(buf)
{
getimage(20,20,200,200,buf);
putimage(100,100, buf,COPY_PUT);
putimage(300,50, buf,COPY_PUT);
}
}
outtext("press a key");
getch();
return 0;
}

13.3 运行结果

14. getlinesettings

14.1 函数说明

函数声明 函数功能
void getlinesettings(struct linesettingstype *lininfo); 取当前线型、模式和宽度

14.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

// the names of the line styles supported
char *lname[] = { "SOLID_LINE",
"DOTTED_LINE",
"CENTER_LINE",
"DASHED_LINE",
"USERBIT_LINE"
};

int main()
{
int gdriver = DETECT, gmode, errorcode;
struct linesettingstype lineinfo;
int midx, midy;
char lstyle[80], lpattern[80], lwidth[80];

initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

// 取当前线型、模式和宽度
getlinesettings(&lineinfo);

sprintf(lstyle, "%s is the line style.", lname[lineinfo.linestyle]);
sprintf(lpattern, "0x%X is the user-defined line pattern.", lineinfo.upattern);
sprintf(lwidth, "%d is the line thickness.", lineinfo.thickness);

settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(midx, midy, lstyle);
outtextxy(midx, midy+2*textheight("W"), lpattern);
outtextxy(midx, midy+4*textheight("W"), lwidth);

getch();
closegraph();
return 0;
}

14.3 运行结果

15. getmaxcolor

15.1 函数说明

函数声明 函数功能
int getmaxcolor(void); 可以传给函数 setcolor 的最大颜色值

15.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
char colstr[80];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

sprintf(colstr, "This mode supports colors 0~%d", getmaxcolor());

settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(midx, midy, colstr);

getch();
closegraph();
return 0;
}

15.3 运行结果

16. getmaxx,getmaxy

16.1 函数说明

函数声明 函数功能
int getmaxx(void); 屏幕的最大x坐标
int getmaxy(void); 屏幕的最大y坐标

16.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
char xrange[80], yrange[80];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

midx = getmaxx() / 2;
midy = getmaxy() / 2;

sprintf(xrange, "X values range from 0~%d", getmaxx());
sprintf(yrange, "Y values range from 0~%d", getmaxy());

settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(midx, midy, xrange);
outtextxy(midx, midy+2*textheight("W"), yrange);

getch();
closegraph();
return 0;
}

16.3 运行结果

参考

  1. [API Reference Document]

C语言函数大全--f开头的函数(下)

总览

函数声明 函数功能
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中

1. floor,floorf,floorl

1.1 函数说明

函数声明 函数功能
double floor (double x); 获取小于或等于 x 的最大整数(double)。
float floorf (float x); 获取小于或等于 x 的最大整数(float)。
long double floorl (long double x) 获取小于或等于 x 的最大整数(long double)。

1.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>

int main()
{
double x = 10.24;
printf("floor(%.2lf) = %.2lf\n", x, floor(x));

float xf = 5.63;
printf("floorf(%.2f) = %.2f\n", xf, floorf(xf));

long double xL = 2.89;
printf("floorl(%.2Lf) = %.2Lf\n", xL, floorl(xL));
return 0;
}

1.3 运行结果

2. _flushall

2.1 函数说明

函数声明 函数功能
int _flushall(void); 清除所有缓冲区,返回打开的流(输入和输出)的数量

2.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
FILE *stream = fopen("STU.FIL", "w");
// 清除所有缓冲区
// 返回打开的流(输入和输出)的数量
printf("%d streams were flushed.\n", _flushall());
fclose(stream);
return 0;
}

2.3 运行结果

3. fma,fmaf,fmal

3.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)。

3.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <math.h>

int main() {

double x = 2.0, y = 3.0, z = 4.0;
float xf = 2.0, yf = 3.0, zf = 4.0;
long double xL = 2.0, yL = 3.0, zL = 4.0;

printf("fma(%lf, %lf, %lf) = %lf\n", x, y, z, fma(x, y, z));
printf("fmaf(%f, %f, %f) = %f\n", xf, yf, zf, fmaf(xf, yf, zf));
printf("fmal(%Lf, %Lf, %Lf) = %Lf\n", xL, yL, zL, fmal(xL, yL, zL));

return 0;
}

3.3 运行结果

4. fmax,fmaxf,fmaxl

4.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)

4.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>

int main()
{
double x = 10.24, y = 5.63;
printf("fmax(%.2lf, %.2lf) = %.2lf\n", x, y, fmax(x, y));

float xf = 5.63, yf = 2.89;
printf("fmaxf(%.2f, %.2f) = %.2f\n", xf, yf, fmaxf(xf, yf));

long double xL = 2.89, yL = 4.56;
printf("fmaxl(%.2Lf, %.2Lf) = %.2Lf\n", xL, yL, fmaxl(xL, yL));
return 0;
}

4.3 运行结果

5. fmin,fminf,fminl

5.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)

5.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>

int main()
{
double x = 10.24, y = 5.63;
printf("fmin(%.2lf, %.2lf) = %.2lf\n", x, y, fmin(x, y));

float xf = 5.63, yf = 2.89;
printf("fminf(%.2f, %.2f) = %.2f\n", xf, yf, fminf(xf, yf));

long double xL = 2.89, yL = 4.56;
printf("fminl(%.2Lf, %.2Lf) = %.2Lf\n", xL, yL, fminl(xL, yL));
return 0;
}

5.3 运行结果

6. fmod,fmodf,fmodl

6.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)。

6.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>

int main()
{
double x = 10.24, y = 5.63;
printf("fmod(%.2lf, %.2lf) = %.20lf\n", x, y, fmod(x, y));

float xf = 5.63, yf = 2.89;
printf("fmodf(%.2f, %.2f) = %.20f\n", xf, yf, fmodf(xf, yf));

long double xL = 2.89, yL = 4.56;
printf("fmodl(%.2Lf, %.2Lf) = %.20Lf\n", xL, yL, fmodl(xL, yL));
return 0;
}

6.3 运行结果

7. fopen

7.1 函数说明

函数声明 函数功能
FILE *fopen(const char *filename, const char *mode); 使用给定的模式mode打开filename所指向的文件。

参数:

  • filename: 要打开的文件全路径名
  • mode: 文件访问模式

返回值:
如果文件顺利打开后,指向该流的文件指针就会被返回;否则文件打开失败则返回 NULL,并把错误代码存在 error 中。

文件访问模式

文件访问模式 说明
"r" 以只读模式打开文件,该文件必须存在。
"w" 以只写模式打开文件。若文件不存在则创建该文件。若文件存在则其现有内容将被清除。
"a" 以追加模式打开只写文件。若文件不存在则创建该文件;如果文件存在,则新写入的数据会被加到文件尾后。
"r+" 以读写模式打开文件,该文件必须存在。
"w+" 以读写模式打开文件。若文件不存在则创建该文件。若文件存在则其内容将被清除。
"a+" 以追加模式打开可读写文件。若文件不存在则创建该文件;如果文件存在,则新写入的数据会被加到文件尾后。
"rb" 以只读模式打开一个二进制文件。
"wb" 以只写模式打开或新建一个二进制文件。
"ab" 以追加模式打开一个二进制文件,并在文件末尾写入数据。
"rb+" 以读写模式打开一个二进制文件,该文件必须存在。
"wb+" 以读写模式打开或创建一个二进制文件。
"ab+" 以追加模式打开一个二进制文件,以便在文件末尾写入数据。该文件也是可读的。
"rt" 以只读模式打开一个文本文件。
"wt" 以只读模式打开或创建文本文件。
"at" 以追加模式打开一个文本文件,并在文件末尾写入数据。
"rt+" 以读写模式打开一个文本文件。
"wt+" 以读写模式打开或创建文本文件。
"at+" 以追加模式打开文本文件,以便在文件末尾写入数据。该文件也是可读的。

7.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *fp;
char buf[30] = "Hello, Huazie 123456789";
fp = fopen("STU.FIL", "w");
printf("temp.txt is created and opened\n");
fwrite(&buf, strlen(buf), 1, fp);
printf("temp.txt is writed\n");
fclose(fp);
printf("temp.txt is closed");
return 0;
}

7.3 运行结果

8. fprintf

8.1 函数说明

函数声明 函数功能
int fprintf(FILE *stream, char *format[, argument,...]); 格式化输出到一个流文件中

8.2 演示示例

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
FILE *stream;
stream = fopen("temp.txt", "w");
fprintf(stream, "%s:%d\n", "Hello Huazie", 456);
fclose(stream);
return 0;
}

8.3 运行结果

9. fputc

9.1 函数说明

函数声明 函数功能
int fputc(int ch, FILE *stream); 将字符【ch为字符的ascii码】写到文件指针stream所指向的文件的当前写指针的位置

注意: 在正常调用情况下,函数返回写入文件的字符的 ASCII 码值,出错时,返回 EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。EOF是在头文件 stdio.h中定义的宏。

9.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(void)
{
char msg[] = "Hello Huazie";
int i = 0;

while (msg[i])
{
fputc(msg[i], stdout);
i++;
}
return 0;
}

9.3 运行结果

10. fputchar

10.1 函数说明

函数声明 函数功能
int fputchar(char ch); 送一个字符到标准输出流(stdout)中,出错则返回EOF

10.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(void)
{
char msg[] = "This is a test";
int i = 0;

while (msg[i])
{
fputchar(msg[i]);
i++;
}
return 0;
}

10.3 运行结果

11. fputs

11.1 函数说明

函数声明 函数功能
int fputs(const char *str, FILE *stream); 把字符串写入到指定的流( stream) 中,但不包括空字符。

注意: fputs 函数如果成功则返回 0,如果发生错误则返回 EOF(-1)

11.2 演示示例

1
2
3
4
5
6
7
8
#include <stdio.h>

int main()
{
int result = fputs("Hello Huazie\n1234", stdout);
printf("\nresult = %d", result);
return 0;
}

11.3 运行结果

12. fread

12.1 函数说明

函数声明 函数功能
int fread(void *buffer, int size, int count, FILE *stream); 从给定输入流stream读取最多count个对象到数组buffer中

参数:

  • buffer : 指向要读取的数组中首个对象的指针
  • size : 每个对象的大小(单位是字节)
  • count : 要读取的对象个数
  • stream : 指定输入流

返回值:
返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count。
sizecount 为零,则 fread 返回零且不进行其他动作。
fread 不区分文件尾和错误,因此调用者必须用 feofferror 才能判断发生了什么。

注意: 如果读取成功,流的文件位置指示器前进读取的字节数;否则出现错误,则流的文件位置指示器的位置不确定。同样若没有完整地读入最后一个元素,则其值也不确定。

12.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char msg[20] = "Hello, Huazie";
char buf[20];

// 以读写模式打开文件。若文件不存在则创建该文件。若文件存在则其内容将被清除。
if ((stream = fopen("temp.txt", "w+")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
// 向文件流中写入数据
fwrite(msg, strlen(msg)+1, 1, stream);
// 重定位流上的文件指针到文件开头
fseek(stream, SEEK_SET, 0);
// 从文件流中读取数据
fread(buf, strlen(msg)+1, 1, stream);
printf("%s\n", buf);

fclose(stream);
return 0;
}

12.3 运行结果

13. free

13.1 函数说明

函数声明 函数功能
void free(void *ptr); 释放ptr指向的存储空间

注意: 被释放的空间通常被送入可用存储区池,以后可以在调用 mallocrealloc 以及 calloc 函数来再分配。

13.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *str;
str = (char *) malloc(7);
strcpy(str, "huazie");
printf("string = %-10s, Address = %u, len = %d\n", str, str, strlen(str));
str = (char *) realloc(str,25); //重新分配内存
strcat(str, ".com");
printf("string = %-10s, Address = %u, len = %d\n", str, str, strlen(str));
free(str);// 释放已分配的内存空间
//内存空间释放后,该空间上的值未知
printf("string = %-10s, Address = %u, len = %d\n", str, str, strlen(str));
return 0;
}

13.3 运行结果

14. freopen

14.1 函数说明

函数声明 函数功能
FILE * freopen(const char *filename, const char *mode, FILE *stream); 以指定模式重新指定到另一个文件

参数:

  • filename: 需要重定向到的文件名或文件路径。
  • mode: 代表文件访问权限的字符串。 参见 27 fopen
  • stream: 需要被重定向的文件流。

14.2 演示示例

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
if(freopen("temp.txt", "w", stdout) == NULL)
fprintf(stderr,"error redirecting stdout\n");
printf("Hello, %s", "Huazie");
fclose(stdout);
return 0;
}

14.3 运行结果

15. frexp,frexpf,frexpl

15.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}$

15.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<math.h>

int main()
{
int exp;
double x = 10.24;
printf("frexp(%.2lf, exp = %d) = %.20lf\n", x, exp, frexp(x, &exp));

float xf = 5.63;
printf("frexpf(%.2f, exp = %d) = %.20f\n", xf, exp, frexpf(xf, &exp));

long double xL = 2.89;
printf("frexpl(%.2Lf, exp = %d) = %.20Lf\n", xL, exp, frexpl(xL, &exp));
return 0;
}

15.3 运行结果

16. fscanf

16.1 函数说明

函数声明 函数功能
int fscanf(FILE *stream, char *format[,argument...]); 从一个流中执行格式化输入

注意: fscanf 遇到空格和换行时结束。它与 fgets 有区别,fgets 遇到空格不结束。

16.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int i;
printf("Input an integer: ");
if (fscanf(stdin, "%d", &i))
printf("The integer is: %d\n", i);
else
{
fprintf(stderr, "Error reading an integer from stdin.\n");
exit(1);
}
return 0;
}

16.3 运行结果

17. fseek

17.1 函数说明

函数声明 函数功能
int fseek(FILE *stream, long offset, int fromwhere); 重定位流上的文件指针位置

注意: 如果执行成功,stream 将指向以 fromwhere【偏移起始位置:文件头 **0(SEEK_SET)**,当前位置 1(SEEK_CUR),文件尾2(SEEK_END) 】为基准,偏移 offset(指针偏移量)个字节的位置。如果执行失败(比如 offset 超过文件自身大小),则不改变 stream 指向的位置。

17.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

long filesize(FILE *stream);

int main(void)
{
FILE *stream = fopen("temp.txt", "w+");
fprintf(stream, "This is a test");
printf("The size of temp.txt is %ld bytes\n", filesize(stream));
fclose(stream);
return 0;
}

long filesize(FILE *stream)
{
long curpos, length;
// 文件指针当前位置相对于文件首的偏移字节数
curpos = ftell(stream);
// 重定向文件指针到文件尾,偏移量 0
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
return length;
}

17.3 运行结果


18. fsetpos

18.1 函数说明

函数声明 函数功能
int fsetpos(FILE *stream, const fpos_t *pos); 将文件指针定位在pos指定的位置上。如果成功返回0,否则返回非0。

18.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdlib.h>
#include <stdio.h>

void showpos(FILE *stream);

int main(void)
{
FILE *stream;
fpos_t filepos;

stream = fopen("STU.FIL", "w+");
// 获取当前文件指针的位置
fgetpos(stream, &filepos);
fprintf(stream, "This is a test");
// 展示当前文件指针的位置
showpos(stream);

/* set a new file position, display it */
if (fsetpos(stream, &filepos) == 0)
showpos(stream);
else
{
fprintf(stderr, "Error setting file pointer.\n");
exit(1);
}

fclose(stream);
return 0;
}

void showpos(FILE *stream)
{
fpos_t pos;
// 展示当前文件指针的位置
fgetpos(stream, &pos);
printf("File position: %ld\n", pos);
}

18.3 运行结果

19. fstat

19.1 函数说明

函数声明 函数功能
int fstat(int handle,struct stat *buf); 由文件描述符获取文件状态

19.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <sys\stat.h>
#include <stdio.h>
#include <time.h>

int main()
{
struct stat statbuf;
FILE *stream;

if ((stream = fopen("STU.FIL", "w+")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
exit(1);
}
fprintf(stream, "This is a test");
fflush(stream);

// get information about the file
fstat(fileno(stream), &statbuf);
fclose(stream);

if (statbuf.st_mode & S_IFCHR)
printf("Handle refers to a device.\n");
if (statbuf.st_mode & S_IFREG)
printf("Handle refers to an ordinary file.\n");
if (statbuf.st_mode & S_IREAD)
printf("User has read permission on file.\n");
if (statbuf.st_mode & S_IWRITE)
printf("User has write permission on file.\n");
// 不知道为啥,我这里文件的驱动号是空
printf("Drive letter of file: %c\n", statbuf.st_dev);
printf("Size of file in bytes: %ld\n", statbuf.st_size);
printf("Time file last opened: %s\n", ctime(&statbuf.st_ctime));
return 0;
}

19.3 运行结果

20. ftell

20.1 函数说明

函数声明 函数功能
long ftell(FILE *stream); 获取文件指针当前位置相对于文件首的偏移字节数

20.2 演示示例

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void)
{
FILE *stream = fopen("temp.txt", "w+");
fprintf(stream, "This is a test");
printf("The file pointer is at byte %ld\n", ftell(stream));
fclose(stream);
return 0;
}

20.3 运行结果

21. fwrite

21.1 函数说明

函数声明 函数功能
int fwrite(const void *ptr, int size, int nitems, FILE *stream); 把ptr所指向的数组中的数据写入到给定流stream中
参数:
  • ptr: 指向要被写入的元素数组的指针。
  • size: 要被写入的每个元素的大小,以字节为单位。
  • nitems: 元素的个数,每个元素的大小为 size 字节。
  • stream: 指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

注意: 如果写入成功,fwrite 返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nitems 参数不同,则会显示一个错误。

21.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

struct mystruct
{
int i;
char ch;
};

int main(void)
{
FILE *stream;
struct mystruct s;
// 以只写模式打开或新建一个二进制文件。
if ((stream = fopen("test.txt", "wb")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
s.i = 0;
s.ch = 'A';
fwrite(&s, sizeof(s), 1, stream);
fclose(stream);

// 以只读模式打开或新建一个二进制文件。
if ((stream = fopen("test.txt", "rb")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
struct mystruct s1;
fread(&s1, sizeof(s1), 1, stream);
printf("%d %c", s1.i, s1.ch);
fclose(stream);

return 0;
}

21.3 运行结果

参考

  1. [API Reference Document]
  2. [IO-标准C库]
  3. [fread]
  4. [freopen]
  5. [fseek]
  6. [fwrite]

C语言函数大全--f开头的函数(上)

总览

函数声明 函数功能
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); 填充一个有界区域

1. fabs,fabsf,fabsl

1.1 函数说明

函数声明 函数功能
double fabs(double x); 返回 x 的绝对值(double)
float fabsf(float x); 返回 x 的绝对值(float)
long double fabsl(long double x); 返回 x 的绝对值(long double)

1.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <math.h>

int main(void)
{
double result, x = -4.5;
result = fabs(x); // 取绝对值

float resultf, xf = -3.5;
resultf = fabsf(xf);

long double resultL, xL = -2.5;
resultL = fabsl(xL);

printf("The absolute value of %lf is %lf\n", x, result);

printf("The absolute value of %f is %f\n", xf, resultf);

printf("The absolute value of %Lf is %Lf\n", xL, resultL);

return 0;
}

1.3 运行结果

2. fclose

2.1 函数说明

函数声明 函数功能
int fclose(FILE *stream); 关闭一个文件流

2.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *fp;
char buf[30] = "Hello, Huazie 123456789";
fp = fopen("temp.txt", "w");
printf("temp.txt is created and opened\n");
fwrite(&buf, strlen(buf), 1, fp);
printf("temp.txt is writed\n");
fclose(fp);
printf("temp.txt is closed");
return 0;
}

2.3 运行结果


3. fcloseall

3.1 函数说明

函数声明 函数功能
int fcloseall(void); 关闭除标准流(stdin、stdout、stderr、stdprn、stdaux)之外的所有打开的流,刷新所有的流缓冲区,并返回关闭的流数。

3.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

#define fcloseall() _fcloseall();

int main()
{
int streams_closed;

fopen("temp.one", "w");
fopen("temp.two", "w");

// 关闭打开流
streams_closed = fcloseall();

if (streams_closed == EOF)
perror("Error");
else
printf("%d streams were closed.\n", streams_closed);

return 0;
}

3.3 运行结果

4. fcvt

4.1 函数说明

函数声明 函数功能
char * fcvt(double value, int ndigit, int *decpt, int *sign); 把一个双精度浮点数转换为字符串
  • value: 要转换的双精度浮点数,输入参数
  • ndigit: 取小数的位数,输入参数
  • decpt: 表示小数点的位置,输出参数
  • sign: 表示value的符号,0为正数,1为负数,输出参数

4.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main()
{
char *string;
double value;
int decpt, sign;

int ndigit = 10;
value = 9.876;
string = fcvt(value, ndigit, &decpt, &sign);
printf("string = %-18s decpt = %d sign = %d value = %lf\n", string, decpt, sign, value);

value = -123.45;
ndigit= 15;
string = fcvt(value, ndigit, &decpt, &sign);
printf("string = %-18s decpt = %d sign = %d value = %lf\n", string, decpt, sign, value);

value = 0.6789e5; /* 科学记数法 scientific notation */
ndigit = 5;
string = fcvt(value, ndigit, &decpt, &sign);
printf("string = %-18s decpt = %d sign = %d value = %lf\n", string, decpt, sign, value);

return 0;
}

4.3 运行结果

5. fdim,fdimf,fdiml

5.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)

5.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>  
#include <math.h>

int main() {

double x = 5.000011;
double y = 3.000041;

double result_d = fdim(x, y);

float xf = 5.000011f;
float yf = 3.000031f;
float result_f = fdimf(xf, yf);

long double xLD = 5.000011L;
long double yLD = 3.000021L;
long double result_ld = fdiml(xLD, yLD);

printf("fdim(%.6lf, %.6lf) = %.6lf\n", x, y, result_d);
printf("fdimf(%.6f, %.6f) = %.6f\n", xf, yf, result_f);
printf("fdiml(%.6Lf, %Lf) = %.6Lf\n", xLD, yLD, result_ld);

return 0;
}

5.3 运行结果

6. fdopen

6.1 函数说明

函数声明 函数功能
FILE * fdopen(int handle, char *type); 将文件描述符和文件流相关联

6.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <sys\stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void)
{
int handle;
FILE *stream;
// 打开 temp.txt 文件
handle = open("temp.txt", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);
// 将文件描述符和文件流关联
stream = fdopen(handle, "w");

if (stream == NULL)
printf("fdopen failed\n");
else
{
fprintf(stream, "%s:%d\n", "Hello world", 123);
fclose(stream);
}
return 0;
}

6.3 运行结果

7. feof

7.1 函数说明

函数声明 函数功能
int feof(FILE *stream); 检测流上的文件结束符。如果文件结束,则返回非0值,否则返回0

7.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main(void)
{
FILE *stream;
// 以读取模式,打开文件 temp.txt
stream = fopen("temp.txt", "r");

// 检查是否文件结束【0:未结束 非0:结束】
while (!feof(stream))
printf("%c", fgetc(stream));

fclose(stream);
return 0;
}

7.3 运行结果

8. ferror

8.1 函数说明

函数声明 函数功能
int ferror(FILE *stream); 检测流上的错误【返回0,表示未出错;返回非零值,表示出错。】

8.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main(void)
{
FILE *stream;
// 以写模式打开文件STU.FIL
stream = fopen("STU.FIL", "w");
// 通过尝试读取来强制出现错误条件
(void) getc(stream);
// 检测流上的错误【返回0,表示未出错;返回非零值,表示出错。】
if (ferror(stream))
{
printf("Error reading from STU.FIL\n");
// 重置错误和EOF标志
clearerr(stream);
}
fclose(stream);
return 0;
}

8.3 运行结果

9. fflush

9.1 函数说明

函数声明 函数功能
int fflush(FILE *stream); 清除读写缓冲区,并将缓冲区内的数据写回参数stream指向的文件中。

9.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>

void flush(FILE *stream);

int main(void)
{
FILE *stream;
char msg[] = "This is a test";

stream = fopen("STU.FIL", "w");
fwrite(msg, strlen(msg), 1, stream);

printf("Press any key to flush STU.FIL:");
getchar();

// 将数据刷新到 STU.FIL 中而不关闭它
flush(stream);

printf("\nFile was flushed, Press any key to quit:");
getchar();
return 0;
}

void flush(FILE *stream)
{
int duphandle;

// flush the stream's internal buffer
fflush(stream);

// make a duplicate file handle
duphandle = dup(fileno(stream));

// close the duplicate handle to flush the DOS buffer
close(duphandle);
}

9.3 运行结果

10. fgetc

10.1 函数说明

函数声明 函数功能
int fgetc(FILE *stream); 从流中读取字符

10.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char string[] = "This is a test";
char ch;

stream = fopen("STU.FIL", "w+");
fwrite(string, strlen(string), 1, stream);
fseek(stream, 0, SEEK_SET);

do
{
ch = fgetc(stream);
putchar(ch);
} while (ch != EOF);

fclose(stream);
return 0;
}

10.3 运行结果

11. fgetchar

11.1 函数说明

函数声明 函数功能
int fgetchar(void); 从流中读取字符

11.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
char ch;
printf("Enter a character followed by <Enter>: ");
// read the character from stdin
ch = fgetchar();
printf("The character read is: '%c'\n", ch);
return 0;
}

11.3 运行结果

12. fgetpos

12.1 函数说明

函数声明 函数功能
int fgetpos(FILE *stream); 依据当前文件的句柄,获取当前访问指针位置信息

12.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char string[] = "This is a test";
fpos_t filepos;
stream = fopen("STU.FIL", "w+");
fwrite(string, strlen(string), 1, stream);
// report the file pointer position
fgetpos(stream, &filepos);
printf("The file pointer is at byte %lld\n", filepos);
fclose(stream);
return 0;
}

12.3 运行结果

13. fgets

13.1 函数说明

函数声明 函数功能
char * fgets(char *str, int n, FILE *stream); 从指定的流中读取数据,每次读取一行

参数:

  • str : 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n: 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream: 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

注意: 如果文件中的一行,不足 n-1 个字符,则读完该行就直接结束。如若该行(包括最后一个换行符)的字符数超过 n-1,则 fgets 只返回一个不完整的行,但是,缓冲区总是以 NULL 字符结尾,对 fgets 的下一次调用会继续读该行。函数成功将返回 stream,失败或读到文件结尾返回 NULL。因此不能直接通过 fgets 的返回值来判断函数是否是出错而终止的,应该借助 feof 函数或者 ferror 函数来判断。

13.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char str[] = "This is a test\n12344";
char msg[20];

stream = fopen("STU.FIL", "w+");
fwrite(str, strlen(str), 1, stream);
// seek to the start of the file
fseek(stream, 0, SEEK_SET);
while(!feof(stream))
{
fgets(msg, strlen(str) + 1, stream);
printf("%s", msg);
}
fclose(stream);
return 0;
}

13.3 运行结果

14. filelength

14.1 函数说明

函数声明 函数功能
long filelength(int handle); 获取文件的长度

14.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void)
{
int handle;
char buf[30] = "This is a test\n12344";
handle = open("STU.FIL", O_CREAT);
write(handle, buf, strlen(buf));
printf("file length in bytes: %ld\n", filelength(handle));
close(handle);
return 0;
}

14.3 运行结果

15. fileno

15.1 函数说明

函数声明 函数功能
int fileno(FILE *stream); 获取参数stream指定的文件流所使用的文件描述符

15.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(void)
{
FILE *stream;
char buf[30] = "This is a test\n12344";
stream = fopen("STU.FIL", "w+");
fwrite(buf, strlen(buf), 1, stream);
// 清除读写缓冲区,并将缓冲区内的数据写回参数stream指向的文件中。
fflush(stream);
// 获取参数stream指定的文件流所使用的文件描述符
int handle = fileno(stream);
printf("file length in bytes: %ld\n", filelength(handle));
fclose(stream);
return 0;
}

15.3 运行结果

16. fillellipse

16.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 较大,椭圆在垂直方向上会显得更高。

16.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <graphics.h>

int main(void)
{
int gdriver = DETECT, gmode;
int xcenter, ycenter, i;

initgraph(&gdriver,&gmode,"");
xcenter = getmaxx() / 2;
ycenter = getmaxy() / 2;

for (i=EMPTY_FILL; i<USER_FILL; i++)
{
cleardevice();
// 设置填充图样和颜色
setfillstyle(i, WHITE);
fillellipse(xcenter, ycenter, 100, 50);
getch();
}

closegraph();
return 0;
}

16.3 运行结果

17. fillpoly

17.1 函数说明

函数声明 函数功能
void fillpoly(int numpoints, int *polypoints); 画并填充一个多边形

参数

  • numpoints : 多边形边数
  • polypoints : 存储各顶点坐标的数组,每两个一组表示一个顶点的X,Y坐标

17.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int i, maxx, maxy;

int poly[8];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

maxx = getmaxx();
maxy = getmaxy();

poly[0] = 20;
poly[1] = maxy / 2;

poly[2] = maxx - 20;
poly[3] = 20;

poly[4] = maxx - 50;
poly[5] = maxy - 20;

poly[6] = maxx / 2;
poly[7] = maxy / 2;

for (i=EMPTY_FILL; i<USER_FILL; i++)
{
setfillstyle(i, getmaxcolor());
fillpoly(4, poly);
getch();
}

closegraph();
return 0;
}

17.3 运行结果

18. findfirst, findnext

18.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 的参数

18.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<io.h>

int main()
{
int handle;
struct _finddata_t FileInfo;
// 搜索与指定的文件名称匹配的第一个文件,若成功则返回第一个文件的文件描述符,否则返回-1L。
if((handle=_findfirst("E:\\Pic\\*.png", &FileInfo))==-1L)
printf("没有找到匹配的项目\n");
else
{
printf("handle=%d\n", handle);
printf("%s\n\n", FileInfo.name);
// 搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1
while(_findnext(handle, &FileInfo)==0)
printf("%s\n",FileInfo.name);
_findclose(handle);
}
return 0;
}

18.3 运行结果

19. finite,finitef

19.1 函数说明

函数声明 函数功能
int finitef (double x); 检查 x 是无穷大值还是NaN 值(double)。如果是无穷大值或NaN值,返回 0;否则返回 1。
int finitef (float x); 检查 x 是无穷大值还是NaN 值(float)。如果是无穷大值或NaN值,返回 0;否则返回 1。

19.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<math.h>

int main()
{
double x = NAN, y = INFINITY, z = 10.24;
printf("finite(%.2lf) = %d\n", x, finite(x));
printf("finite(%.2lf) = %d\n", y, finite(y));
printf("finite(%.2lf) = %d\n", z, finite(z));

float xf = NAN, yf = INFINITY, zf = 5.63;
printf("\nfinitef(%.2f) = %d\n", xf, finitef(xf));
printf("finitef(%.2f) = %d\n", yf, finitef(yf));
printf("finitef(%.2f) = %d\n", zf, finitef(zf));
return 0;
}

19.3 运行结果

20. floodfill

20.1 函数说明

函数声明 函数功能
void floodfill(int x, int y, int border); 填充一个有界区域

参数

  • int x :要开始填充的区域的起始点的 x 坐标;
  • int y :要开始填充的区域的起始点的 y 坐标;
  • int border :填充的边界颜色。泛洪填充算法会从起始点 (x, y) 开始,将所有相邻的、颜色与起始点相同的区域填充为新的颜色,直到遇到边界颜色 border 为止。这样,算法就不会越过由 border 颜色定义的边界,从而保证了填充区域的准确性。

20.2 演示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int maxx, maxy;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

maxx = getmaxx();
maxy = getmaxy();

// select drawing color
setcolor(getmaxcolor());
// select fill color
setfillstyle(SOLID_FILL, getmaxcolor());
// draw a border around the screen
rectangle(0, 0, maxx, maxy);
// draw some circles
circle(maxx / 3, maxy /2, 50);
circle(maxx / 2, 20, 100);
circle(maxx-20, maxy-50, 75);
circle(20, maxy-20, 25);

getch();

// fill in bounded region
floodfill(2, 2, getmaxcolor());

getch();
closegraph();
return 0;
}

20.3 运行结果

参考

  1. [API Reference Document]
  2. [fgets]
  3. [_findfirst]
  4. [MATH-标准C库]