【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出
目录
一、fprintf() 函数
1.1. 函数简介
1.2. fprintf使用场景
1.3. 注意事项
1.4. 示例
二、fscanf() 函数
2.1. 函数简介
2.2. fscanf使用场景
2.3. 注意事项
2.3. 示例
三、总结
在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行读写操作,使数据的处理更加灵活和方便。
一、fprintf()
函数
1.1. 函数简介
函数原型:
int fprintf(FILE *stream, const char *format, ...);
- 功能:向文件流中写入格式化的数据。
- 参数:
stream
:文件指针。format
:格式字符串,指定输出数据的格式。...
:可变参数,根据格式字符串进行格式化输出。
- 返回值:成功写入的字符数,包括末尾的空字符(如果有的话);失败时返回负数。
1.2. fprintf使用场景
fprintf函数在C/C++编程中广泛使用,主要用于将格式化的数据输出到指定的文件流中。其主要使用场景包括:
- 日志记录:将程序运行时产生的日志信息输出到文件中,便于后续的调试和排错。
- 数据存储:将程序计算或处理得到的数据保存到文件中,以便后续使用或分析。
- 数据导出:将程序处理过的数据按照指定的格式导出到文件中,供其他程序或系统使用。
- 输出报表:将程序生成的报表或统计数据保存到文件中,方便查看和分析。
- 配置文件生成:将程序运行时需要的配置信息保存到文件中,方便程序读取和使用。
- 错误日志:将程序运行时出现的错误信息保存到文件中,用于错误追踪和处理。
1.3. 注意事项
在使用fprintf函数时,需要注意以下几点:
- 文件打开:在调用fprintf之前,必须确保文件已经以正确的模式(如写入模式"w"或追加模式"a")打开,并且获取了有效的文件指针。
- 格式化字符串:格式化字符串必须正确编写,包含必要的格式化指令(如%d、%f、%s等),用于指定输出数据的类型和格式。同时,需要确保格式化字符串与提供的参数列表相匹配,以避免输出错误或程序崩溃。
- 参数列表:fprintf函数的参数列表是可变的,其类型和数量由格式化字符串中的格式化指令决定。在调用时,必须按照格式化指令的顺序依次传递相应的参数。
- 返回值检查:fprintf函数的返回值是成功输出的字符数(不包括末尾的空字符),如果发生错误则返回负数。虽然在实际使用中很少根据返回值进行错误处理,但在某些情况下检查返回值可以帮助调试和诊断问题。
- 文件关闭:在完成文件写入后,应使用fclose函数关闭文件流,以释放资源并避免潜在的文件损坏。
- 缓冲区刷新:在某些情况下,为了确保数据及时写入文件,可能需要手动刷新输出缓冲区。虽然fprintf通常会在每次调用时自动刷新缓冲区(这取决于具体的实现和文件流的状态),但在某些特殊情况下(如输出到非标准文件流时),可能需要使用fflush函数来手动刷新缓冲区。
1.4. 示例
以下是一个使用fprintf函数将格式化数据写入文件的简单示例:
#include <stdio.h> int main() { FILE *file; int num = 123; float pi = 3.14159; char str[] = "Hello, World!"; // 打开文件以写入数据 file = fopen("output.txt", "w"); if (file == NULL) { printf("无法打开文件\n"); return 1; } // 使用fprintf向文件中写入格式化数据 fprintf(file, "整数: %d\n", num); fprintf(file, "浮点数: %.2f\n", pi); fprintf(file, "字符串: %s\n", str); // 关闭文件 fclose(file); return 0;
}
运行结果:
定义了要写入文件的数据(一个整数、一个浮点数和一个字符串)。接着,使用fopen
函数以写入模式("w")打开了一个名为"output.txt"的文件,并获取了文件指针。之后,我们使用fprintf
函数将格式化的数据写入文件。最后,我们使用fclose
函数关闭了文件流。如果文件打开失败,fopen
函数会返回NULL,此时我们打印了一条错误消息并返回了1。
二、fscanf()
函数
2.1. 函数简介
函数原型:
int fscanf(FILE *stream, const char *format, ...);
- 功能:从文件流中读取格式化的数据。
- 参数:
stream
:文件指针。format
:格式字符串,指定输入数据的格式。...
:可变参数,变量的地址,用于存储读取的数据。
- 返回值:成功读取的输入项的数量,可能会因为匹配失败或到达文件末尾而小于请求的数量。
2.2. fscanf使用场景
fscanf函数是C语言标准库中的一个函数,它用于从文件流中读取格式化的输入。其使用场景非常广泛,包括但不限于:
- 读取配置文件:程序经常需要从配置文件中读取设置或参数,这些文件通常以键值对或特定格式存储,fscanf可以根据指定的格式字符串读取这些数据。
- 解析数据文件:对于存储了结构化数据的文件(如CSV文件、日志文件等),fscanf可以按照文件的格式规则读取并解析数据。
- 读取用户输入文件:在某些程序中,用户可能需要上传或指定一个文件作为输入,程序可以使用fscanf从该文件中读取所需的数据。
- 测试与验证:在开发过程中,为了测试程序的某个功能,可能需要从文件中读取测试数据,fscanf提供了一种便捷的方式来读取这些数据。
2.3. 注意事项
在使用fscanf函数时,需要注意以下几点:
- 文件打开模式:确保文件以正确的模式(如读取模式"r")打开,并且文件指针是有效的。
- 格式字符串:格式字符串必须正确编写,以匹配文件中数据的格式。如果格式字符串与文件中的数据格式不匹配,fscanf可能无法正确读取数据。
- 变量类型匹配:传递给fscanf的变量类型必须与格式字符串中指定的类型相匹配。如果类型不匹配,可能会导致数据读取错误或程序崩溃。
- 返回值检查:fscanf的返回值是成功匹配的输入项数,不包括任何填充的空白字符。如果返回值小于预期,可能表示读取过程中出现了错误或文件末尾已到达。
- 空白字符处理:fscanf默认会跳过输入中的空白字符(如空格、制表符、换行符等),直到找到与格式字符串匹配的数据。如果需要读取空白字符,可以使用%c格式说明符,并注意处理空格和换行符。
- 文件关闭:在完成文件读取后,应使用fclose函数关闭文件流,以释放资源并避免潜在的文件损坏。
- 头文件:在使用文件输入输出函数之前,需要包含
stdio.h
头文件。
2.3. 示例
以下是一个使用fscanf函数从文件中读取数据的简单示例:
#include <stdio.h> int main() { FILE *fp; int age; float height; char name[50]; // 打开文件 fp = fopen("output.txt", "r"); if (fp == NULL) { perror("Error opening file"); return -1; } // 读取数据 while (fscanf(fp, "%s %d %f", name, &age, &height) == 3) { printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height); } // 关闭文件 fclose(fp); return 0;
}
假设output.txt
文件包含了一系列以空格分隔的姓名、年龄和身高数据。使用fscanf函数从文件中读取这些数据,并打印到控制台上。注意,这里使用了%s
来读取字符串,但需要注意的是,%s
会读取直到遇到第一个空白字符(空格、制表符或换行符)为止的字符序列,并且不会跳过前面的空白字符。如果文件中姓名之间或姓名与其他数据之间可能包含多个空白字符,或者需要读取包含空格的字符串,则可能需要使用其他方法(如fgets
配合sscanf
)来读取数据。
三、总结
格式化文件输入输出函数fprintf
和fscanf
是C语言标准库中的重要组成部分,它们允许程序以格式化的方式处理文件内容。在使用这些函数时,需要注意格式控制字符串的书写、文件指针的有效性以及可能的错误处理。通过合理运用这些函数,可以实现灵活、高效的文件输入输出操作。
相关文章:

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出
目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行…...
[概率论] 随机变量
Kolmogorov 定义的随机变量是基于测度论和实变函数的。这是因为随机变量的概念需要精确地定义其可能的取值、发生的概率以及这些事件之间的依赖关系。 测度论:在数学中,测度论是用来研究集合大小的理论,特别是无穷可数集和无界集的大小。对于…...
中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...
安全设计与集成服务能力三级是通信网络安全服务能力评定安全设计与集成服务能力评定的最高等级,所需的要求也会更加严苛,不仅要满足安全设计与集成服务二级能力要求的所有条款,还要满足以下要求: 规模与资产要求 1)单位正规编制员…...
【C++语言】类和对象(下)
一、再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…...

【Spring】什么是Spring?
什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...
全面理解-c++11中的智能指针
在 C 中,智能指针(Smart Pointers) 是用于自动管理动态分配内存的类模板,遵循 RAII(Resource Acquisition Is Initialization) 原则,确保资源在生命周期结束时被正确释放,避免内存泄…...

【jmeter】在windows中,创建的变量,在jmeter中,读取变量失败的问题,路径问题
1.0 在windows中,jmeter读取变量失败 在路径配置的时候,配置按照D:\FtpDownload\${file_name}运行之后,下载的文件,文件名出现问题 \取消了$符号的意义,所以需要更改路径 D:\\FtpDownload\\${file_name}...

【CubeMX-HAL库】STM32F407—无刷电机学习笔记
目录 简介: 学习资料: 跳转目录: 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…...

使用 POI-TL 和 JFreeChart 动态生成 Word 报告
文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中,我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart,实现动态生成 W…...

xxl-job的分片广播
目录 xxl-job的分片广播 场景引入 xxl-job简介 xxl-job的部署安装 代码编写 1.导入依赖 2.yml文件编写 3.编写xxl-job执行器配置类,维护一个xxl-job执行器的bean 4.编写第一个任务,任务名字叫firstJob 5.进入服务端,增加执行器和任务…...

MobaXterm破解会话上限限制
1. 下载安装包MobaXterm-Keygen 下载路径: https://gitcode.com/gh_mirrors/mob/MobaXterm-Keygen 2. 搭建python3环境 window下python3环境搭建可参考网站: https://blog.csdn.net/enteracity/article/details/135479689 3. 生成文件Custom.mxtpro…...
vscode设置保存时自动缩进和格式化
参考博客 如何在 VSCode 中自动缩进你的代码 | Linux 中国 省流 使用 Ctrl Shift P 来打开命令模式,搜索 Open User Settings 并按下回车你需要搜索 Auto Indent,并在 “编辑器:自动缩进(Editor: Auto Indent)” 中选择 “全部(Full)”P…...

一键查看电脑各硬件详细信息 轻松查看电脑硬件参数
今天为大家推荐两款非常实用的电脑硬件查看软件,它们能够一键快速查看电脑的各种配置信息,使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的,无需安装,打开即可使用,文件大小仅为900多KB࿰…...

【C++11】lambda和包装器
1.新的类功能 1.1默认的移动构造和移动赋值 原来C类中,有6个默认成员函数:构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 载/const 取地址重载,最后重要的是前4个,后两个⽤处不⼤,默认成员函数就是我们不写…...

react redux用法学习
参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 安装相关依赖: 使用redux的中间件: npm i react-reduxreact-…...
前端HTML标签 meta中常见的一些属性
meta中常见的一些属性 <meta/> 标签的属性 <meta/> 是什么? <meta/> 标签主要用于表示和当前文档相关的 元数据 信息。 而 元数据(metadata),简单的来说就是描述数据的数据。例如,一个 HTML 文件是一…...

127,【3】 buuctf [NPUCTF2020]ReadlezPHP
进入靶场 吓我一跳 查看源码 点击 审计 <?php// 定义一个名为 HelloPhp 的类,该类可能用于执行与日期格式化相关的操作 class HelloPhp {// 定义一个公共属性 $a,用于存储日期格式化的模板public $a;// 定义一个公共属性 $b,用于存储…...
继承(python)
一、基础知识 (一)定义:子类能继承父类所有的公有属性和公有方法(先使用子类的方法、属性) (二)格式: class 子类名(父类名): #父类 class Ph…...
驱动开发系列36 - Linux Graphics 2D 绘制流程
一: 概述 在Linux中,2D绘制流程是操作系统、图形库、显示协议、驱动程序等多个组件协调工作的结果。整体流程如下步骤所示: 1. 客户端请求:客户端程序(如GTK、Qt应用程序)通过X11协议与Xorg-Server通信(或通过Wayland协议与Wayland合成器通信)、请求绘制2D图形,比如绘制…...
STL函数算法笔记
STL函数算法笔记 今天我们来学习的是STL库中的一些函数。首先,STL这个东西大家一定非常熟悉,里面很多的数据结构都帮了大家不少忙,那么今天我们就来说几个重要的数据结构。 向量 向量,也就是数据结构vector,你也可以称之为动态数组,本质跟数组差不多,只不过有一些好处…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...