C/C++文件操作————写文件与读文件以及通讯录的改进 (保姆级教学)

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言

2.写文件函数与读文件函数

2.1fputc函数

2.2fgetc函数

2.3fputs函数

2.4fgets函数

2.5fprintf函数

2.6fscanf函数

2.7sprintf函数与sscanf函数

2.8fwrite函数

2.9fread函数 

3.通讯录的改进

4.文件的随机读写

4.1fseek函数

4.2ftell函数

4.3rewind函数

 5.总结


1.前言

         在前面我们写到过文件的打开与关闭用到了函数主要是fopen函数,参数是文件的文件名和打开方式,文件关闭函数fclose,参数是流,我们还讲到过流,今天我们讲解一些写文件与读文件函数以及对通讯录的改进还有一些文件的其他函数。

2.写文件函数与读文件函数

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

2.1fputc函数

        我们在cplusplus网中 fputc看到它的第一个参数是int  chararcter,这个含义是想要存储的字符信息,第二个参数是流在这里指fopen函数的返回值,fputc函数是将chararcter存入文件中,我们写一个代码将abcdef放到文件中,详细代码如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i;for (i = 'a'; i <= 'f'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

我们运行后打开文件data.txt

我们可以看到abcdef已经写到了文件中 先打开文件,再利用循环利用写入字符函数fputc进行信息的存储。

2.2fgetc函数

        我们进入cplusplus网站fgetc我们看到它的参数是流,返回值是int类型,hfgetc函数的作用是读取文件的一个字符,我们写一个代码读取fputc函数存在文件的信息,详细代码如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int i,ch;for (i = 'a'; i <= 'f'; i++){ch = fgetc(pf);printf("%c", ch);}fclose(pf);pf = NULL;return 0;
}

我们运行结果如下:

2.3fputs函数

         我们进入cplusplus网站fputs,函数的第一个参数是const char *str是将str中的内容传到文件中,第二个参数是流 ,返回类型是int,fputs函数的作用是将字符串传到文件中,我们写一个代码将字符串abcdefgh传到文件中,详细代码如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}char arr[] = "abcdefgh";fputs(arr,pf);fclose(pf);pf = NULL;return 0;
}

运行后我们打开data.txt文件 可以看到

我们如果再次将arr内容改为ccc运行后打开data.txt文件

我们还可以看到打开文件后光标都在最前面,而且原来的信息也没有了,那我们是不是可以理解为写入文件是将原来的文件的内容覆盖, 然后写入信息。

2.4fgets函数

        我们进入cplusplus网站fgets看到它的第一个参数是char *str是读取文件后存放在程序的变量,第二个参数int num是在文件中读取几个字符+1,第三个参数是流,返回值是char*,例如我们想读取文件中的abcdefg,详细代码如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[1006] ;char* p = arr;p = fgets(p, 7, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

我们运行后可以看到

 对于为什么是7,原因很简单,fgets函数会在最后将数组的第num个位置转化为’\0‘,我们进入调试可以看到

2.5fprintf函数

 

        我们进入 cplusplus网站fprintf 查看fprintf函数的参数,看到这个函数你是不是会想到printf函数,我们同样查看printf函数的参数

我们可以看到他们两个只差流这个参数,fprintf函数是格式化输入文件,我们写一个代码来展示一下这个函数的功能,代码如下:

#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}S = { 1.23f,10,"wo" };fprintf(pf, "%f-%d-%s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}

 我们运行程序后打开data.txt文件,可以看到

同样我们可以理解为将结构体S里面的内容,以  -  -  的形式输出到文件里。

2.6fscanf函数

         我们进入cplusplus网站fscanf查看fscanf函数的参数,看到fscanf函数我们很容易想到scanf函数,我们同样进入cplusplus网站查看scanf函数的参数,

我们可以看到这两个函数的参数只差了一个流, fscanf函数是将文件中有格式的信息储存在程序中定义的变量里,我们利用fprintf函数储存在文件的内容来初始化结构体S,详细代码如下:

#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf,"%f-%d-%s", &S.s, &S.i, &S.s1);printf("%f %d %s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}

我们运行代码,可以看到

2.7sprintf函数与sscanf函数

        sprintf函数是将数据以字符的形式存在s中, sscanf函数是将s的数据以字符的形式存在程序定义的变量中,我们写一个程序,代码如下:

#include<stdio.h>
struct num {int i;char arr;float f;
};
int main()
{struct num s = { 10,'c',1.2f};char arr[100] = { 0 };sprintf(arr, "%d%c%f", s.i, s.arr, s.f);struct num tmp = { 0 };sscanf(arr, "%d%c%f", &tmp.i, &tmp.arr, &tmp.f);printf("%d %c %f", tmp.i, tmp.arr, tmp.f);return 0;
}

运行结果如下:

2.8fwrite函数

        我们进入cplusplus网站fwrite的参数第一个参数是const void *ptr是指向的数据的地址,第二个参数size_t size是单个数据所占据的字节,第三个参数size_t count是要写进文件几个数据,第四个参数是流,特别注意这是以二进制的形式储存在文件中 ,我么们写一个代码展示一下函数的功能,代码如下:

#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}struct num s = { 1,"abcd","efg" };fwrite(&s, sizeof(struct num), 1, pf);fclose(pf);pf = NULL;return 0;
}

我们运行代码后,打开data.txt文件可以看到:

由于是二进制的形式存储,所以有些信息我们不能识别。

2.9fread函数 

         我们进入cplusplus网站看fread的参数一个参数是const void *ptr是要读取文件信息保存到,第二个参数size_t size是单个数据所占据的字节,第三个参数size_t count是要写进文件几个数据,第四个参数是流,我们读取上个函数的内容,代码如下:

#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}struct num s;fread(&s, sizeof(struct num), 1, pf);printf("%d\n%s\n%s", s.i, s.arr, s.brr);fclose(pf);pf = NULL;return 0;
}

运行程序后可以看到

3.通讯录的改进

在程序中加入函数

void init(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return;}while (fread(pc->arr + pc->i , sizeof(struct xinxi), 1, pf)){		pc->i++;addnum(pc);}fclose(pf);pf = NULL;
}

以及函数

void save(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fclose");return;}int i;for (i = 0; i < pc->i; i++){fwrite(pc->arr + i, sizeof(struct xinxi), 1, pf);}fclose(pf);pf = NULL;
}

4.文件的随机读写

4.1fseek函数

根据文件指针的位置和偏移量来定位文件指针,第一个参数是流,第二个参数是偏移量v,第三个参数是相对位置,SEEK_SET是对于最初的位置,SEEK_CUR是对现在的位置,SEEK_END是对最后一位的位置。

 我们写一个代码,如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}int ch;ch = fgetc(pf);printf("%c", ch);//ach = fgetc(pf);printf("%c", ch);//bch = fgetc(pf);printf("%c", ch);//cfseek(pf, -3, SEEK_CUR);ch = fgetc(pf);printf("%c", ch);//afclose(pf);pf = NULL;return 0;
}

运行后为

这个函数有一定的局限性,我们必须对文件的内容非常熟悉,否则不容易输出我们想要的值。

4.2ftell函数

这个函数是计算相对于初始位置的偏移量 ,我们可以写一个代码,如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, 0, SEEK_END);size_t sz = ftell(pf);printf("%d", sz);fclose(pf);pf = NULL;return 0;
}

运行结果为

4.3rewind函数

函数的功能是让指针指向初始位置,我们写一个代码,来展示一下它的功能:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, -1, SEEK_END);int ch;ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

运行结果为

文件的内容为

 5.总结

        今天主要包括将数据传入文件的函数,以及将文件中的内容传到程序中的函数,还有一些对于文件中的指针以及偏移量的函数fseek函数,ftell函数,rewind函数的讲解,异界对通讯录的改造.今天的内容就结束了。

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

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

相关文章

多个JDK版本可以吗:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂

多个版本JDK切换 多个JDK&#xff1a;JDK17、JDK19、JDK1.8轻松切换&#xff08;无坑版&#xff09;小白也可以看懂 提示&#xff1a;看了网上很多教程&#xff0c;5w观看、32w观看、几千观看的&#xff0c;多多少少带点坑&#xff0c;这里我就把踩过的坑都给抹了 文章目录 多…

「Verilog学习笔记」不重叠序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 题目要求检测a的序列&#xff0c;a为单bit输入&#xff0c;每个时刻可能具有不同的值&#xff0c; 当连续的六个输入值符合目标序列表示序列匹配&#xff0c;当六个输入值的…

Redisson分布式锁源码解析、集群环境存在的问题

一、使用Redisson步骤 Redisson各个锁基本所用Redisson各个锁基本所用Redisson各个锁基本所用 二、源码解析 lock锁 1&#xff09; 基本思想&#xff1a; lock有两种方法 一种是空参 另一种是带参 * 空参方法&#xff1a;会默认调用看门狗的过期时间30*1000&…

内网穿透的应用-如何在本地安装Flask,以及将其web界面发布到公网上并进行远程访问

轻量级web开发框架&#xff1a;Flask本地部署及实现公网访问界面 文章目录 轻量级web开发框架&#xff1a;Flask本地部署及实现公网访问界面前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何…

『亚马逊云科技产品测评』活动征文|通过Lightsail搭建个人笔记

提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 前言实践知识储备Lightsail介绍Leanote介绍实践…

VSCode插件koroFileHeader的使用。

文章目录 前言一、koroFileHeader是什么&#xff1f;二、使用步骤1.安装1.配置2.食用 前言 今天的天气还不错&#xff0c;真是金风玉露一相逢&#xff0c;便胜却人间无数&#xff0c;写篇博客玩玩&#xff0c;主题&#xff1a;注释。注释的本质就是对代码的解释和说明&#xf…

STM32_6(TIM)

TIM定时器&#xff08;第一部分&#xff09; TIM&#xff08;Timer&#xff09;定时器定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时不仅…

在游戏开发中,实时渲染和离线渲染对于游戏平衡的影响有哪些?

实时渲染和离线渲染对游戏平衡有那些影响呢&#xff1f;在游戏开发中&#xff0c;渲染方式的选择对游戏的整体表现和玩家体验有着至关重要的作用。那么&#xff0c;实时渲染和离线渲染究竟有哪些利弊呢&#xff1f; 一、实时渲染 实时渲染&#xff0c;顾名思义&#xff0c;是…

Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂

目录 前言 一 首先我为啥要重装Vs Code呢&#xff1f; 二 下载1.84.2Visual Studio Code 三 配置Vscode终端字体 四 安装插件 前言 这是一篇将老版本的VsCode下载至最新版的博文&#xff0c;从下载到调试全篇 一 首先我为啥要重装Vs Code呢&#xff1f; 因为我想安装这个…

1、postman的安装及使用

一、安装、登录 1.安装 下载地址 2.注册登录&#xff08;保存云服务进度&#xff09; 二、界面介绍 三、执行接口测试页面 请求页签&#xff1a; 1、params&#xff1a;当是get请求时&#xff0c;通过params传参 2、authorization&#xff1a;鉴权 3、headers&#xff1…

idea 26 个天花板技巧

1、 查看代码历史版本&#xff1b;2、 调整idea的虚拟内存&#xff1a;&#xff1b;3、 idea设置成eclipse的快捷键&#xff1b;4、 设置提示词忽略大小写&#xff1b;5、 关闭代码检查&#xff1b;6、 设置文档注释模板&#xff1b;7、 显示方法分隔符&#xff1b;8、 设置多行…

DAOS低时延与高性能RDMA网络

什么是RDMA RDMA&#xff08;Remote Direct Memory Access&#xff09;远程直接内存访问是一种技术&#xff0c;它使两台联网的计算机能够在主内存中交换数据&#xff0c;而无需依赖任何一台计算机的处理器、缓存或操作系统。与基于本地的直接内存访问 ( DMA ) 一样&#xff0c…

03-详细介绍Stream及其常用API

Stream API Stream API(java.util.stream)把真正的函数式编程风格引入到Java中,可以极大地提高程序员生产力&#xff0c;让程序员写出高效、简洁的代码 实际开发中项目中多数数据源都是来自MySQL、Oracle等关系型数据库,还有部分来自MongDB、Redis等非关系型数据库 从关系型…

1.测试基础

目录 一、测试基础 1.软件测试中基础信息定义 2.测试主流技能 3.常见的测试分类 3.1按阶段划分 3.2按代码可见度划分 3.3其他 4.测试模型 5.测试流程 6.测试用例 二、用例设计方法 2.1等价类 2.2 边界值 2.3判定表法 2.4场景法 2.5错误推测法 三、缺陷管理 1…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《交直流配电网中柔性软开关接入的规划-运行协同优化方法》

这个标题涉及到交直流配电网中柔性软开关接入的规划-运行协同优化方法。下面是对这个标题各部分的详细解读&#xff1a; 交直流配电网&#xff1a; 这指的是一个电力系统&#xff0c;同时包含交流和直流电力传输的元素。这样的系统可能结合了传统的交流电力传输和近年来兴起的直…

python中一个文件(A.py)怎么调用另一个文件(B.py)中定义的类AA详解和示例

本文主要讲解python文件中怎么调用另外一个py文件中定义的类&#xff0c;将通过代码和示例解读&#xff0c;帮助大家理解和使用。 目录 代码B.pyA.py 调用过程 代码 B.py 如在文件B.py,定义了类别Bottleneck&#xff0c;其包含卷积层、正则化和激活函数层&#xff0c;主要对…

WordPress用sql命令批量删除所有文章

有时我们需要将一个网站搬迁到另一个服务器。我们只想保留网站的模板样式&#xff0c;而不需要文章内容。一般情况下我们可以在后台删除已发表的文章&#xff0c;但如果有很多文章&#xff0c;我们则需要一次删除所有文章。 WordPress如何批量删除所有文章 进入网站空间后台&a…

常见树种(贵州省):013桉树、米槠、栲类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、桉树 …

Java中的字符串String

目录 一、常用方法 1、字符串构造 2、String对象的比较 &#xff08;1&#xff09;、equals方法 &#xff08;2&#xff09;、compareTo方法 &#xff08;3&#xff09;、compareToIgnoreCase方法&#xff08;忽略大小写进行比较&#xff09; 3、字符串查找 4、转化 &…

4.3 实时阴影

一、基于图像的阴影技术&#xff08;Shadow Map&#xff09; 什么是阴影 当来自光源的至少一个点在空间中被遮挡时&#xff0c;就产生了阴影区域。 阴影的前提 直接光照不透明物体 阴影的实现方式 阴影体&#xff08;Shadow Volumes&#xff09;——空间中黑暗部分的几何…