扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-标准IO接口之格式化输出

2025/11/12
1021
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

将格式化数据写到标准输出,通常称为格式化输出,除了常见的printf外,还有如下四个函数。

1.printf

将格式化数据输出到标准输出。

1)头文件

#include <stdio.h>

2)函数原型

int printf( const char *format, ... );

3)参数

format:表示C 字符串,包含了要打印的格式化数据。

...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

4)返回值

如果成功,返回输出的字符数;如果出错,返回负值。

5)示例

#include <stdio.h>

int main()

{

printf("printf testn");

printf("printf test %dn", 2);

return 0;

}

6)编译运行并查看测试结果

printf test

printf test 2

2.fprintf

将格式化数据写入到FILE指针指定的文件中。

1)头文件

#include <stdio.h>

2)函数原型

int fprintf(FILE *stream, const char *format, ...);

3)参数

stream:要操作的文件指针。

format:表示C 字符串,包含了要被写入到流 stream 中的数据。

...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

4)返回值

如果成功,返回输出到文件中的字符数;如果出错,返回负值。

5)示例:(打开ftest文件,向标准输出和ftest写入特定数据)

#include <stdio.h>

int main()

{

FILE *fp = fopen("ftest", "w+");

if (!fp) {

printf("error: ftest openn");

return -1;

}

fprintf(stdout, "stdout testn");

fprintf(fp, "stdout test %dn", 2);

fclose(fp);

return 0;

}

6)编译运行并查看测试结果

stdout test

$ cat ftest             //cat查看ftest文件内容

stdout test 2

3.dprintf

将格式化数据写入到由文件描述符fd指定的文件中。

1)头文件

#include <stdio.h>

2)函数原型

int dprintf(int fd, const char *format, ...);

3)参数

fd:要操作的文件描述符。

format:表示C 字符串,包含了要被写入到fd中的格式化数据。

...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

4)返回值

如果成功,返回输出到文件中的字符数;如果出错,返回负值。

5)示例:(打开ftest文件,向标准输出和ftest写入特定数据)

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

int main()

{

int fd = open("ftest", O_RDWR | O_CREAT | O_TRUNC, 0666);

if (fd < 0) {

printf("error: ftest openn");

return -1;

}

dprintf(1, "dprintf testn");

dprintf(fd, "dprintf test %dn", 2);

close(fd);

return 0;

}

6)编译运行并查看测试结果

dprintf test

$ cat ftest                    //cat查看ftest文件内容

dprintf test 2

4.sprintf

将格式化数据写入到指定的缓冲区中,并在末尾加结束字符‘‘。注意,由于写入的缓冲区大小可能比数据小,可能出现缓冲区溢出问题。

1)头文件

#include <stdio.h>

2)函数原型

int sprintf(char *buf, const char *format, ...);

3)参数

buf:表示要将数据写入到的字符数组指针。

format:表示C 字符串,包含了要被写入到buf中的格式化数据。

...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

4)返回值

如果成功,返回写入的字符数(不包括加在字符串末尾的结束空字符);如果出错,返回负值。

5)示例:(将数据写入缓冲区,再写入标准输出)

#include <stdio.h>

int main()

{

char buf[30];

sprintf(buf, "sprintf testn");

fprintf(stdout, "%s", buf);

sprintf(buf, "%dn", 100);

fprintf(stdout, "%s", buf);

return 0;

}

6)编译运行并查看测试结果

sprintf test

100

5.snprintf

由于sprintf函数可能会发生缓冲区溢出的问题,存在安全隐患,为了解决这个问题,引入了snprintf函数。同样是将格式化数据写入到指定的缓冲区中,并在末尾加结束字符‘‘。而如果写入的字节数大于缓冲区大小,超出的部分将会被丢弃,防止缓冲区溢出。

1)头文件

#include <stdio.h>

2)函数原型

int snprintf(char *buf, size_t size, const char *format, ...);

3)参数

buf:表示要将数据写入到的字符数组指针。

size:表示缓冲区的长度。

format:表示C 字符串,包含了要被写入到buf中的格式化数据,长度为size-1(1为追加的结束字符)。

...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

4)返回值

如果成功,返回写入的字符数(不包括加在字符串末尾的结束空字符);如果出错,返回负值。

5)示例:(将数据写入缓冲区,再写入标准输出)

#include <stdio.h>

int main()

{

char buf[5];

snprintf(buf, 5, "snprintf test");

fprintf(stdout, "%sn", buf);

snprintf(buf, 5, "%dn", 100);

fprintf(stdout, "%s", buf);

return 0;

}

6)编译运行并查看测试结果

snpr          //编译时会警告snprintf输出14字节到5字节的缓冲区,属于编译器正常

100          //提示,此处为了验证snprintf的功能,警告可忽略

相关推荐