c语言-文件的读写操作(上)

文章目录

  • 前言
  • 一、文件基础
    • 1.1 文件的分类
    • 1.2 文件路径和文件名
  • 二、文件的打开和关闭
    • 2.1 文件指针
    • 2.2 文件的打开和关闭
  • 三、文件顺序读写
    • 3.1 fputc()和fgetc()
    • 3.2 fputs()和fgets()
    • 3.3 fprintf()和fscanf()
    • 3.4 fwrite()和fread()
    • 3.4 对比一组函数
  • 总结


前言

本篇文章介绍c语言的文件读写操作。


一、文件基础

1.1 文件的分类

在c语言中,从文件的功能角度来看,文件可分为以下两类

  • 程序文件
    程序文件包含源文件(.c)、目标文件(.obj)、可执行文件(.exe)
  • 数据文件
    数据文件的内容是供程序运行时读/写(输入/输出)的数据;
    数据文件包含文本文件和二进制文件

1.2 文件路径和文件名

文件路径分为两类

  • 相对路径
  • 绝对路径

文件名包含3部分:文件路径(E:\cproject\advancedC)+文件名称(data)+文件后缀名(.txt)

E:\cproject\advancedC\data.txt

文件名作为文件的唯一标识,以便系统识别和使用。

二、文件的打开和关闭

2.1 文件指针

在缓冲文件系统中,每个被使用的文件 都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息(比如文件的名称,文件状态等)。通过定义一个结构体变量存储这些信息。这个结构体通过类型重名,命名为FILE。
每当打开一个文件时,操作系统根据文件的情况自动创建一个FILE类型的结构体变量,并填充结构中的信息。
一般通过一个FILE*类型的指针去维护文件信息。

FILE* pf; //文件指针变量

定义一个文件指针变量pf,pf可以指向某个文件的文件信息区。通过文件信息区中的信息能够访问pf的文件,即通过文件指针变量能够找到与其关联的文件。

2.2 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在成功打开文件后,都会返回一个FILE*的指针变量并指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用以下两个函数打开文件和关闭文件

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

fopen()参数说明

  • filename:要打开的文件名(包含路径)
  • mode:文件的打开模式
文件打开模式含义如果文件不存在
"r"以只读的方式打开一个已存在的文本文件出错
"w"以只写的方式打开一个文本文件建立一个新文件
"a"向文本文件末尾追加数据建立一个新文件
"rb"以只读的方式打开一个二进制文件出错
"wb"以只写的方式打开一个二进制文件建立一个新文件
"ab"向二进制文件末尾追加数据建立一个新文件
"r+"以读写的方式打开一个文本文件出错
"w+"以读写的方式打开一个文本文件建立一个新文件
"a+"以读写的方式打开一个文本文件,在文件末尾进行读写建立一个新文件
"rb+"以读写的方式打开一个二进制文件出错
"wb+"以读写的方式打开一个二进制文件建立一个新文件
"ab+"以读写的方式打开一个二进制文件,在文件末尾进行读写建立一个新文件

注意: 在使用文件之前,要对打开文件的进行判断是否打开成功

	//1.打开文件FILE* pf = fopen("data.txt", "w");//判断if (NULL == pf){//利用perror()打印错误信息perror("fopen");return 1;}//2. 使用文件//....//3. 关闭文件fclose(pf);pf = NULL;

三、文件顺序读写

文件的读写操作分三步

第一步:打开文件
第二步:读/写文件
第三步:关闭文件

以下是c语言提供的库函数对文件读/写操作的支持

功能函数名操作对象
字符输入函数fgetc()所有输入流
字符输出函数fputc()所有输出流
字符串输入函数fgets()所有输入流
字符串输出函数fputs()所有输出流
格式化输入函数fscanf()所有输入流
格式化输出函数fprintf()所有输出流
二进制输入fread()文件
二进制输出fwrite()文件

任何一个c程序,只要运行起来就会默认打开三个流

  • stdin -> 标出输入流(键盘)
  • stdout->标准输出流(屏幕)
  • stderr->标准错误流(屏幕)

因此,在c程序中
可以直接使用scanf()直接接收键盘数据(stdin);
printf()直接将信息输出到屏幕(stdout);
perror()直接将错误信息输出到屏幕(stderr)。

3.1 fputc()和fgetc()

将一个字符写入文件

#include<stdio.h>//fputc()向文件写入一个字符
int main()
{//1. 打开文件FILE* pf = fopen("data.txt", "w");if (NULL == pf){//利用perror()打印错误信息perror("fopen");return 1;}//2. 读/写文件//向文件写入1个字符 fputc()char ch = 0;scanf("%c", &ch);fputc(ch,pf);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

从文件中读取一个字符

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.txt", "r");if (NULL == pf){//利用perror()打印错误信息perror("fopen");return 1;}//2. 读/写文件//读取文件1个字符 fgetc()int ch = fgetc(pf);printf("%c", ch);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

3.2 fputs()和fgets()

将一个字符串写入文件

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.txt","w"); if (NULL == pf){perror("fopen");return 1;}//2. 读/写文件//fputs()->写char str_write[20] = "Hi,PYSpring!";fputs(str_write,pf);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

从文件读取一个字符串

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");return 1;}//2. 读/写文件//fgets()->读char str_read[20] = { 0 };fgets(str_read, sizeof(str_read), pf);printf("%s\n", str_read);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

3.3 fprintf()和fscanf()

定义一个结构体

typedef struct Student  //定义个学生结构体类型
{char student_number[20];  //学号char student_name[20];   //名字int age;                 //年龄
} Student;

将格式化数据写入文件

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.txt","w");if (NULL == pf){perror("fopen()");return 1;}//2. 读/写文件//写Student student = {"20240125","PYSpring", 24};fprintf(pf,"%s %s %d",student.student_number,student.student_name, student.age);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

从文件读取格式化数据

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen()");return 1;}//2. 读/写文件//读Student tmp = { 0 };fscanf(pf, "%s %s %d", tmp.student_number, tmp.student_name, &(tmp.age));printf("学号:%s\n姓名:%s\n年龄: %d\n", tmp.student_number, tmp.student_name, tmp.age);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

3.4 fwrite()和fread()

将数据以二进制形式写入到一个二进制文件中

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.bin","wb");if (NULL == pf){perror("fopen");return 1;}//2. 读/写文件// fwrite()以二进制形式写入Student student = { "20240125","PYSpring66", 24 };fwrite(&student,sizeof(Student),1,pf);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

从一个二进制文件以二进制形式读取数据

#include<stdio.h>
int main()
{//1. 打开文件FILE* pf = fopen("data.bin","rb");if (NULL == pf){perror("fopen");return 1;}//2. 读/写文件// fwrite()以二进制形式写入Student student = { 0 };fread(&student,sizeof(Student),1,pf);printf("学号:%s\n姓名:%s\n年龄: %d\n", student.student_number, student.student_name, student.age);//3. 关闭文件fclose(pf);pf = NULL;return 0;
}

3.4 对比一组函数

  • scanf()、fscanf()、sscanf()
    scanf() ->针对标准输入的格式化输入
    fscanf() ->针对所有输入流的格式化输入
    sscanf() ->从一个字符串中转化成一个格式化数据
  • printf()、fprintf()、sprintf()
    printf() ->针对标准输出的格式化输出
    fprintf() ->针对所有输出流的格式化输出
    sprintf() ->将一个格式化数据转化为字符串

总结

本篇文章介绍了文件的打开与关闭,最后介绍文件的顺序读写操作。

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

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

相关文章

python使用PaddleOCR实现《命名实体识别项目》OCR(已实现)(ai领域必看,简单易用)

1.简介&#xff1a; PaddleOCR是飞桨&#xff08;PaddlePaddle&#xff09;推出的一个端到端的光学字符识别开源工具集&#xff0c;支持中文、英文、数字以及特殊符号等各种类型的文字检测、识别和词语整体识别。该工具集使用PaddlePaddle深度学习框架技术&#xff0c;提供了多…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下&#xff0c;拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案&#xff0c;助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

Spring Boot 中 Service 层依赖注入问题

目录 问题描述 产生错误 问题原因 解决方法 手动注入方法 1、使用工具集 hutool&#xff0c;引入 Maven 依赖 2、编写 SpringUtil 工具类 问题描述 Controller 层方法为 static 静态&#xff0c;引入 Service 层时使用 Autowired 注解自动装配&#xff0c;Controller层方…

C#用 DateAndTime.DateAdd方法和DateTime.Add(TimeSpan) 方法分别添加一段时间间隔

目录 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔 2.用DateTime.Add方法添加一段时间间隔 二、实例 1.实例1&#xff1a;用 DateAndTime.DateAdd方法 2.实例2&#xff1a;用DateTime.Add方法 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔…

CentOS7 安装Nginx,网站部署、请求转发

文章目录 前言1. 安装2. 启动3. 开机启动4. 检查Nginx服务的状态5. 简单部署项目6. 检查Nginx配置7. 重新加载Nginx配置启动错误错误分析端口权限解决方法完整部署项目nginx.conf 配置文件证书配置、请求转发前言 Nginx是一款高性能的Web服务器和反向代理服务器,被广泛用于构…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…

2024年预制菜行业市场发展趋势分析(2021-2023年预制菜行业数据分析)

近期&#xff0c;老干妈被称为预制菜、预制菜国标报送稿出炉等事件再次引起大众对于预制菜市场的讨论。随着国家对预制菜审核标准的严格化&#xff0c;预制菜市场未来走向将会如何&#xff1f;鲸参谋带大家从数据角度来了解。 首先来看下预制菜市场的行业发展情况。 根据鲸参…

浅聊ansible的幂等 file模块源码解析

描述# 幂等性是在实际应用中经常需要考虑的概念&#xff0c;尤其是运维中。相较于将幂等性理解为各种异常情况的综合处理&#xff0c;将其理解为执行时需要考虑到在前次执行产生的影响的情况下能够正常执行则会更加容易接近业务需求。   ansible包含众多的模块&#xff0c;大…

第3章:Python 的函数和模块(基于最新版 Python3.12 编写)

文章目录 3.1 函数&#xff1a;编写你的代码乐曲3.1.1 什么是函数&#xff1f;3.1.2 如何定义函数&#xff1f;3.1.3 如何调用函数&#xff1f;3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…

蓝桥杯备赛 week 4 —— DP 背包问题

目录 &#x1f308;前言&#x1f308;&#xff1a; &#x1f4c1; 01背包问题 分析&#xff1a; dp数组求解&#xff1a; 优化&#xff1a;滚动数组&#xff1a; &#x1f4c1; 完全背包问题 &#x1f4c1; 总结 &#x1f308;前言&#x1f308;&#xff1a; 这篇文章主…

大数据就业方向-(工作)ETL开发

上一篇文章&#xff1a; 大数据 - 大数据入门第一篇 | 关于大数据你了解多少&#xff1f;-CSDN博客 目录 &#x1f436;1.ETL概念 &#x1f436;2. ETL的用处 &#x1f436;3.ETL实现方式 &#x1f436;4. ETL体系结构 &#x1f436;5. 什么是ETL技术&#xff1f; &…

每日OJ题_算法_二分查找⑧_力扣LCR 173. 点名

目录 力扣LCR 173. 点名 解析代码 力扣LCR 173. 点名 LCR 173. 点名 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 示例 1: 输入: records …

力扣0087——扰乱字符串

扰乱字符串 难度&#xff1a;困难 题目描述 使用下面描述的算法可以扰乱字符串 s 得到字符串 t &#xff1a; 如果字符串的长度为 1 &#xff0c;算法停止如果字符串的长度 > 1 &#xff0c;执行下述步骤&#xff1a; 在一个随机下标处将字符串分割成两个非空的子字符串…

c# cad PromptSelectionResult批量选择 PromptEntityOptions选择单个实体介绍

一、PromptSelectionResult &#xff1a; 是 AutoCAD .NET API 中的一个类&#xff0c;位于 Autodesk.AutoCAD.EditorInput 命名空间下。它代表了用户在 AutoCAD 编辑器中进行图形对象选择操作的结果。 当你通过 Editor 类的 GetSelection() 方法&#xff08;或者其他类似的方…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

11. 发送邮件

1. 简介 Spring Boot 收发邮件最简便方式是通过 spring-boot-starter-mail。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>spring-boot-starter-mail 本质…

hive - explode 用法以及练习

hive explode 的用法以及练习 一行变多行 explode 例如&#xff1a; 临时表 temp_table &#xff0c;列名为1st 1st1,2,34,5,6 变为 1 2 3 4 5 6 方式一&#xff1a;直接使用 explode select explode(split(1st,,)) from temp_table;方式二&#xff1a;使用 lateral view…

spring-boot-starter-validation常用注解

文章目录 一、使用二、常用注解三、Valid or Validated &#xff1f;四、分组校验1. 分组校验的基本概念2. 定义验证组3. 应用分组到模型4. 在控制器中使用分组5. 总结 一、使用 要使用这些注解&#xff0c;首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-bo…

Java问题排查工具集

Java 问题排查工具箱 n 默认值相关问题 l -XX:PrintFlagsFinal || jinfo -flags n 类装载相关问题 l -XX:TraceClassLoading n 应用无响应相关问题 l sar 等系统指标 l jstack [-l] [-m] Java 问题排查工具箱 n 内存相关问题 l -XX:HeapDumpOnOutOfMemoryEr…

探秘Dmail:Web3世界的通讯引领者

摘要&#xff1a;在一个充满潜力并且对创新要求严格的领域中&#xff0c;Dmail作为一种开创性的Web3通讯协议应运而生。 1月24日&#xff0c;OKX Jumpstart宣布上线Dmail&#xff0c;在Web3领域引起了巨大反响&#xff0c;这是一个旨在重新定义数字通讯范式的富有远见的项目&a…