当前位置: 首页 > news >正文

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

三、总结

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

http://www.lryc.cn/news/534497.html

相关文章:

  • [概率论] 随机变量
  • 中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...
  • 【C++语言】类和对象(下)
  • 【Spring】什么是Spring?
  • 全面理解-c++11中的智能指针
  • 【jmeter】在windows中,创建的变量,在jmeter中,读取变量失败的问题,路径问题
  • 【CubeMX-HAL库】STM32F407—无刷电机学习笔记
  • 使用 POI-TL 和 JFreeChart 动态生成 Word 报告
  • xxl-job的分片广播
  • MobaXterm破解会话上限限制
  • vscode设置保存时自动缩进和格式化
  • 一键查看电脑各硬件详细信息 轻松查看电脑硬件参数
  • 【C++11】lambda和包装器
  • react redux用法学习
  • 前端HTML标签 meta中常见的一些属性
  • 127,【3】 buuctf [NPUCTF2020]ReadlezPHP
  • 继承(python)
  • 驱动开发系列36 - Linux Graphics 2D 绘制流程
  • STL函数算法笔记
  • 【Vue】在Vue3中使用Echarts的示例 两种方法
  • 小红书自动化:如何利用Make批量生成爆款笔记
  • 学习率调整策略 | PyTorch 深度学习实战
  • DeepSeekMoE 论文解读:混合专家架构的效能革新者
  • 以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案:
  • 【JVM详解五】JVM性能调优
  • 2.10日学习总结
  • 疯狂前端面试题(四)
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-metrics.py
  • SuperCopy解除网页禁用复制功能插件安装和使用
  • UP-VLA:具身智体的统一理解与预测模型