【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出

news2025/2/11 11:07:35

目录

一、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)来读取数据。

三、总结

格式化文件输入输出函数fprintffscanf是C语言标准库中的重要组成部分,它们允许程序以格式化的方式处理文件内容。在使用这些函数时,需要注意格式控制字符串的书写、文件指针的有效性以及可能的错误处理。通过合理运用这些函数,可以实现灵活、高效的文件输入输出操作。

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

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

相关文章

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

c++----函数重载

目录标题 为什么会有函数重载函数重载的概念函数重载的例子第一个&#xff1a;参数的类型不同第二个&#xff1a;参数的个数不同第三种&#xff1a;类型的顺序不同函数重载的奇异性重载函数的底层原理有关函数重载的一个问题 为什么会有函数重载 大家在学c语言的时候有没有发现…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵&#xff0c;具体表示如下&#xff1a; 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯&#xff0c;整合传统的多项能力&#xff08;NLP、OCR、CV等&#xff09;&#xff0c;构建以场景为中心的新型智能文档平台。通过文档审阅&#xff0c;实现结构化、半结构化和非结构化文档的信息获取、处理及审核&#xff0c;同时基于大…

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

【大模型实战】使用Ollama+Chatbox实现本地Deepseek R1模型搭建

下载安装Ollama Ollama官方链接:https://ollama.com/,打开链接后就可以看到大大的下载按钮,如下图: 我选择用Win的安装。将Ollama的安装包下载到本地,如果下载慢可以复制链接到迅雷里面,提高下载速度,如下图: 双击之后,就可以开始安装了,如下图: 默认安装到C盘,…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…

9 Pydantic复杂数据结构的处理

在构建现代 Web 应用时&#xff0c;我们往往需要处理复杂的输入和输出数据结构。例如&#xff0c;响应数据可能包含嵌套字典、列表、元组&#xff0c;甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库&#xff0c;可以帮助我们轻松地处理这些复杂的数据结构&#…

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&am…

kafka消费端之消费者协调器和组协调器

文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段&#xff08;JOINGROUP&#xff09;**选举消费组的lcader选举分区分配策略 第三阶段&#xff08;SYNC GROUP&…

IDEA升级出现问题Failed to prepare an update Temp directory inside installation

IDEA升级出现问题"Failed to prepare an update Temp directory inside installation…" 问题来源&#xff1a; 之前修改了IDEA的默认配置文件路径&#xff0c;然后升级新版本时就无法升级&#xff0c;提示"Failed to prepare an update Temp directory insid…

十款开源的论坛建站工具

以下是十款开源的论坛建站工具&#xff0c;它们各具特色&#xff0c;能够满足不同用户的需求&#xff1a; Discuz!&#xff08;Crossday Discuz! Board&#xff09; 特点&#xff1a;基础架构采用web编程组合PHPMySQL&#xff0c;用户可以在不需要任何编程的基础上&#xff0c;…

vue学习6

1. 智慧商城 1. 路由设计配置 单个页面&#xff0c;独立展示的&#xff0c;是一级路由 2.二级路由配置 规则&组件配置导航链接配置路由出口 <template><div id"app"><!--二级路由出口--><router-view></router-view><van-…

线程池以及日志、线程总结

一、线程池以及日志 1、基础线程池写法 主线程在main函数中构建一个线程池&#xff0c;初始化(Init)后开始工作(Start) 此时线程池中每个线程都已经工作起来了&#xff0c;只是任务队列中任务为空&#xff0c;所有线程处于休眠状态(通过线程同步中的条件变量实现&#xff0c…

Vue 响应式渲染 - 过滤应用

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue响应式渲染综合 - 过滤应用 目录 过滤应用 引入vue Vue设置 设置页面元素 模糊查询过滤实现 函数表达式实现 总结 过滤应用 综合响应式渲染做一个输入框&#xff0c;用来实现&#xff1b;搜索输入框关键词符合列表。…