细说C语言将格式化输出到FILE *stream流的函数fprintf、_fprintf_I、fwprintf、_fwprintf_I

news2025/6/7 14:36:59

目录

1、将格式化数据输出到FILE *stream流基本型

(1)语法

(2)参数

(3)示例

2、将格式化数据输出到FILE *stream流并启用并启用在格式字符串中使用参数的顺序的规范

(1)语法

(2)参数

(3)示例

3、将格式化数据输出到FILE *stream流安全版本

(1)语法

(2)参数

(3)示例


        C语言将格式化输出到FILE *stream流的函数的外观表达是以fprintf()为根的。将格式化输出到FILE *stream流的函数有:

1、将格式化数据输出到FILE *stream流基本型

        fprintf、_fprintf_I、fwprintf、_fwprintf_I。

        在VS2022  版本17.13.6上使用这些函数,会出现警告C6387。提示:“stream”可能是“0”: 这不符合函数“fprintf”的规范。比如:
        警告    C6387    “stream”可能是“0”: 这不符合函数“fprintf”的规范。Test_fprintf_2    C:\Users\YCZN_MT\source\repos\Test_fprintf_2\Test_fprintf_2\Test_fprintf_2.c    21        

         解决的办法是:增加代码的鲁棒性,让逻辑更严谨。具体做法就是,增加空指针检查。

(1)语法

/**
fprintf 格式化一系列字符和值并将其输出到输出 stream。 每个 argument 函数(如果有)根据 format 中相应的格式规范进行转换和输出。 对于 fprintf,format 参数具有与 printf 中相同的语法。
fwprintf 是 fprintf 的宽字符版本;在 fwprintf 中,format 是宽字符字符串。 如果在 ANSI 模式下打开流,则这些函数行为相同。 fprintf 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。
*/

int fprintf(
   FILE *stream,
   const char *format [,
   argument ]...
);
int _fprintf_l(
   FILE *stream,
   const char *format,
   _locale_t locale [,
   argument ]...
);
int fwprintf(
   FILE *stream,
   const wchar_t *format [,
   argument ]...
);
int _fwprintf_l(
   FILE *stream,
   const wchar_t *format,
   _locale_t locale [,
   argument ]...
);

(2)参数

  • stream:指向 FILE 结构的指针。
  • format:窗体控件字符串。
  • argument:可选参数。
  • locale:要使用的区域设置。
  • 返回值:fprintf 返回已写入的字节数。 fwprintf 返回已写入的宽字符数。其中每个函数在出现输出错误时返回一个负值。

(3)示例

// test_fprintf_2.c
/* This program uses fprintf to format various
* data and print it to the file named FPRINTF.OUT. It
* then displays FPRINTF.OUT on the screen using the system
* function to invoke the operating-system TYPE command.
*/

#include <stdio.h>
#include <process.h>

FILE* stream;

int main(void)
{
	int    i = 10;
	double fp = 1.5;
	char   s[] = "this is a string";
	char   c = '\n';

	fopen_s(&stream, "fprintf_2.out", "w");
	fprintf(stream, "%s%c", s, c);	//C6387
	fprintf(stream, "%d\n", i);
	fprintf(stream, "%f\n", fp);
	fclose(stream);					// C6387
	system("type fprintf_2.out");
}

         这段代码运行后会出现2处警告C6387,通过增加空指针检查,警告C6387消失:

// test_fprintf.c
/* This program uses fprintf to format various
* data and print it to the file named FPRINTF.OUT. It
* then displays FPRINTF.OUT on the screen using the system
* function to invoke the operating-system TYPE command.
*/

#include <stdio.h>
#include <process.h>

FILE* stream;
errno_t err;

int main(void)
{
	int i = 10;
	double fp = 1.5;
	char s[] = "this is a string";
	char c = '\n';

	//err的作用:在调用 fclose 函数前添加空指针检查,可以避免警告 C6387
	err = fopen_s(&stream, "fprintf.out", "w");
	if (err != 0) 
		puts("文件打开失败\n");
	else {
		printf("文件打开成功\n");				//可以注释掉
		if (stream != NULL)
		{
			fprintf(stream, "%s%c", s, c);
			fprintf(stream, "%d\n", i);
			fprintf(stream, "%f\n", fp);
			fclose(stream);
		}
	}
	system("type fprintf.out");
}

        运行结果:

文件打开成功
this is a string
10
1.500000

C:\Users\YCZN_MT\Test_fprintf\x64\Debug\Test_fprintf.exe (进程 18692)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

2、将格式化数据输出到FILE *stream流并启用并启用在格式字符串中使用参数的顺序的规范

         _fprintf_p、_fprintf_p_l、_fwprintf_p、_fwprintf_p_I。

(1)语法

/**
_fprintf_p 格式化一系列字符和值并将其输出到输出 stream。 每个 argument 函数(如果有)根据 format 中相应的格式规范进行转换和输出。 对于 _fprintf_p,format 参数具有与 _printf_p 中相同的语法。 这些函数支持位置参数,即可以更改格式字符串所使用的参数顺序。 
_fwprintf_p 是 _fprintf_p 的宽字符版本;在 _fwprintf_p 中,format 是宽字符字符串。 如果在 ANSI 模式下打开流,则这些函数行为相同。 _fprintf_p 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前区域设置。
*/

int _fprintf_p(
   FILE *stream,
   const char *format [,
   argument ]...
);
int _fprintf_p_l(
   FILE *stream,
   const char *format,
   _locale_t locale [,
   argument ]...
);
int _fwprintf_p(
   FILE *stream,
   const wchar_t *format [,
   argument ]...
);
int _fwprintf_p_l(
   FILE *stream,
   const wchar_t *format,
   _locale_t locale [,
   argument ]...
);

(2)参数

  • stream:指向 FILE 结构的指针。
  • format:窗体控件字符串。
  • argument:可选参数。
  • locale:要使用的区域设置。
  • 返回值:如果发生输出错误,则 _fprintf_p 和 _fwprintf_p 返回写入的字符数或一个负值。
  • _p:启用在格式字符串中使用参数的顺序的规范。按照“”内出现的参数顺序依次输出,参数顺序就是变量的排列序号。比如:("%2$s%1$c%3$d\n%4$f\n", c, s,i,fp),变量的排列序号依次是c=1,s=2,i=3,fp=4,“”内定义的参数输出顺序依次是:2、1、3、4,即s、c、i、fp。

(3)示例

// test_fprintf_p.c
// This program uses _fprintf_p to format various
// data and print it to the file named FPRINTF_P.OUT. It
// then displays FPRINTF_P.OUT on the screen using the system
// function to invoke the operating-system TYPE command.
//

#include <stdio.h>
#include <process.h>

int main(void)
{
    FILE* stream = NULL;
    int     i = 10;
    double  fp = 1.5;
    char    s[] = "this is a string";
    char    c = '\n';

    // Open the file
    if (fopen_s(&stream, "fprintf_p.out", "w") == 0)
    {
        // Format and print data
        _fprintf_p(stream, "%2$s%1$c", c, s);    //在格式字符串中使用了参数顺序
        _fprintf_p(stream, "%d\n", i);           //此处应用等价于fprintf
        _fprintf_p(stream, "%f\n", fp);
        _fprintf_p(stream, "%2$s%1$c%3$d\n%4$f\n", c, s,i,fp);    //在格式字符串中使用了参数顺序
        _fprintf_p(stream, "%3$d\n%4$f\n%2$s%1$c", c, s,i,fp);    //在格式字符串中使用了参数顺序
        // Close the file
        fclose(stream);
    }

    // Verify our data
    system("type fprintf_p.out");
}

        运行结果:

this is a string
10
1.500000
this is a string
10
1.500000
10
1.500000
this is a string

C:\Users\YCZN_MT\Test_fprinf_p\x64\Debug\Test_fprinf_p.exe (进程 21844)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

3、将格式化数据输出到FILE *stream流安全版本

         fprintf_s、_fprintf_s_l、fwprintf_s、fwprintf_s_l

(1)语法

/**
fprintf_s 格式化一系列字符和值并将其输出到输出 stream。 argument_list 中的每个参数(如果有)根据 format 中相应的格式规范进行转换和输出。 format 参数使用 printf 和 wprintf 函数的格式规范语法。
fwprintf_s 是 fprintf_s 的宽字符版本;在 fwprintf_s 中,format 是宽字符字符串。 如果在 ANSI 模式下打开流,则这些函数行为相同。 fprintf_s 当前不支持到 UNICODE 流中的输出。
这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前区域设置。
*/

int fprintf_s(
   FILE *stream,
   const char *format [,
   argument_list ]
);
int _fprintf_s_l(
   FILE *stream,
   const char *format,
   _locale_t locale [,
   argument_list ]
);
int fwprintf_s(
   FILE *stream,
   const wchar_t *format [,
   argument_list ]
);
int _fwprintf_s_l(
   FILE *stream,
   const wchar_t *format,
   _locale_t locale [,
   argument_list ]
);

(2)参数

  • stream:指向 FILE 结构的指针。
  • format:窗体控件字符串。
  • argument_list:格式字符串的可选参数。
  • locale:要使用的区域设置。
  • 返回值:fprintf_s 返回已写入的字节数。 fwprintf_s 返回已写入的宽字符数。 其中每个函数在出现输出错误时返回一个负值。

(3)示例

// test_fprintf_s.c
// This program uses fprintf_s to format various
// data and print it to the file named FPRINTF_S.OUT. It
// then displays FPRINTF_S.OUT on the screen using the system
// function to invoke the operating-system TYPE command.

#include <stdio.h>
#include <process.h>

FILE* stream;

int main(void)
{
	int    i = 10;
	double fp = 1.5;
	char   s[] = "this is a string";
	char   c = '\n';
	errno_t err;

	//err的作用:在调用 fclose 函数前添加空指针检查,可以避免警告 C6387
	err = fopen_s(&stream, "fprintf_s.out", "w");
	if (err != 0)
		puts("文件打开失败\n");
	else {
		//printf("文件打开成功\n");				//可以注释掉
		if (stream != NULL)
		{
			fprintf_s(stream, "%s%c", s, c);
			fprintf_s(stream, "%d\n", i);
			fprintf_s(stream, "%f\n", fp);
			fclose(stream);
		}
	}
	system("type fprintf_s.out");
}

        运行结果:

this is a string
10
1.500000

C:\Users\YCZN_MT\Test_fprintf_s\x64\Debug\Test_fprintf_s.exe (进程 21396)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地日记本,用于记录日常。

文章目录 想法程序说明展望 想法 本人想要复盘以前的事情&#xff0c;所以就想着写一个小程序&#xff0c;记录一下一天发生了什么事情。以后如果忘记了可以随时查看。写日记的想法来自我看的一本书&#xff0c;里面有一段话说的意思是&#xff0c;经验从来都不是随着年龄增长…

[蓝桥杯]格子刷油漆

格子刷油漆 题目描述 X 国的一段古城墙的顶端可以看成 2N2N 个格子组成的矩形&#xff08;如下图所示&#xff09;&#xff0c;现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起&#xff0c;刷完一格&#xff0c;可以移动到和它相邻的格子&#xff08;对角相邻也算数&…

ubuntu下libguestfs-tools

在ubuntu下&#xff0c;使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享&#xff1a;sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称&#xff1a;virt-filesystems -a /mnt/hgfs/D/vmware/FGT_VM64-v7…

Authentication failed(切换了新的远程仓库tld)

启用 Git Credential Manager git config --global credential.helper manager 强制弹出凭据输入窗口 git config --global credential.helper.modalprompt true 指定 TFS 服务器使用基础认证&#xff08;Basic Auth&#xff09; git config --global credential.https://…

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析

文章目录 一、课程管理模块前端代码截图二、前端代码及分析index.vuecourse.js 三、前端执行流程1. 组件初始化2. 查询操作3. 列表操作4. 对话框操作5. API 请求6. 执行流程总结关键点 四、课程管理模块后端代码截图五、后端代码块CourseControllerICourseServiceCourseMapperC…

智能升级:中国新能源汽车充电桩规模化建设与充电桩智慧管理方案

近年来&#xff0c;中国新能源汽车产业快速发展&#xff0c;市场规模持续扩大&#xff0c;但充电基础设施的建设与管理仍面临布局不均、利用率低、智能化水平不足等问题。为推动新能源汽车普及&#xff0c;国家正加速充电桩的规模化建设&#xff0c;并通过智慧化管理提升运营效…

接口自动化测试之pytest接口关联框架封装

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一般情况下&#xff0c;我们是通过一个yaml文件进行关联实现 在根目录下新建一个文件yaml&#xff0c;通过上述conftest.py文件实现全局变量的更新: 1.首先需要建…

M1安装并使用Matlab2024a进行java相机标定

安装 Matlab下载地址&#xff1a;https://www.macxin.com/archives/23771.html注意⚠️&#xff1a;如若需要java调用Matlab函数&#xff0c;则需要java版本为21 使用 安装完成之后运行此节目可以看到&#xff1a; 构建jar 命令行输入deploytool&#xff0c;会有一个弹窗&a…

02-Redis常见命令

02-Redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; 贴心小建议&#xff1a;命令不要死记&#xff0c;学会查询就好啦 Redis为了方便学习&#xff0c;将操作不同数据类型的命…

华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Java转Go日记(五十七):gin 中间件

1. 全局中间件 所有请求都经过此中间件 package mainimport ("fmt""time""github.com/gin-gonic/gin" )// 定义中间 func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t : time.Now()fmt.Println("中间件开始执行了&quo…

嵌入式学习笔记 - freeRTOS的两种临界禁止

一 禁止中断 通过函数taskENTER_CRITICAL() &#xff0c;taskEXIT_CRITICAL()实现 更改就绪列表时&#xff0c;通常是通过禁止中断的方式&#xff0c;进入临界段&#xff0c;因为systick中断中有可以更改就绪列表的权利&#xff0c; 就绪列表&#xff08;如 pxReadyTasksLis…

202403-02-相似度计算 csp认证

其实这个问题就是求两篇文章的词汇的交集和并集&#xff0c;首先一说到并集&#xff0c;我就想到了set集合数据结构&#xff0c;set中的元素必须唯一。 STL之set的基本使用–博客参考 所以将两个文章的词汇全部加入set中&#xff0c;并求出set的大小&#xff0c;即为并集的大小…

【Oracle】游标

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 游标基础概述1.1 游标的概念与作用1.2 游标的生命周期1.3 游标的分类 2. 显式游标2.1 显式游标的基本语法2.1.1 声明游标2.1.2 带参数的游标 2.2 游标的基本操作2.2.1 完整的游标操作示例 2.3 游标属性2.3.1…

<4>, Qt窗口

目录 一&#xff0c;菜单栏 二&#xff0c;工具栏 三&#xff0c;状态栏 四&#xff0c;浮动窗口 五&#xff0c;对话框 一&#xff0c;菜单栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 创建菜单栏…

6.04打卡

浙大疏锦行 DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 损失: 0.502 | 准确率: 75.53% 训练完成 import torch import torch.nn as nn import torch.optim as optim from…

【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南

引言 在当今互联网应用开发中&#xff0c;缓存技术已成为提升系统性能和用户体验的关键组件。Redis作为一款高性能的键值存储数据库&#xff0c;以其丰富的数据结构、快速的读写能力和灵活的扩展性&#xff0c;被广泛应用于各类系统的缓存层设计。本文将围绕一个基于Redis的图…

Spring Boot微服务架构(十):Docker与K8S部署的区别

Spring Boot微服务在Docker与Kubernetes&#xff08;K8S&#xff09;中的部署存在显著差异&#xff0c;主要体现在技术定位、管理能力、扩展性及适用场景等方面。以下是两者的核心区别及实践对比&#xff1a; 一、技术定位与核心功能 Docker 功能&#xff1a;专注于单节点容器化…

vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定

效果展示 根据后端接口返回&#xff0c;当前登录用户详情中的页面中el-table组件的显示隐藏等功能。根据菜单id查询该菜单下能后显示的列。 后端返回的数据类型: 接收到后端返回的数据后处理数据结构. Table组件文件 <!-- 自己封装的Table组件文件 --> onMounted(()>…

pikachu靶场通关笔记13 XSS关卡09-XSS之href输出

目录 一、href 1、常见取值类型 2、使用示例 3、安全风险 二、源码分析 1、进入靶场 2、代码审计 3、渗透思路 三、渗透实战 1、注入payload1 2、注入payload2 3、注入payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff…