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

news2024/12/24 2:49:51

个人主页:点我进入主页

专栏分类: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);//a
	ch = fgetc(pf);
	printf("%c", ch);//b
	ch = fgetc(pf);
	printf("%c", ch);//c
	fseek(pf, -3, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c", ch);//a
	fclose(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.coloradmin.cn/o/1120345.html

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

相关文章

打印新闻标题,使用封装get、set方法,打印前15个字符串

package day21; import java.util.ArrayList; import java.util.Collections;/*** author monian* Wo yi wu ta,wei shou shu er!*/ public class Homework01 {SuppressWarnings({"all"})public static void main(String[] args) {News news1 new News("新冠确…

Typora的相关配置(Typora主题、字体、快捷键、习惯)

Typora的相关配置(Typora主题、字体、快捷键、习惯) 文章目录 Typora的相关配置(Typora主题、字体、快捷键、习惯)[toc]一、主题配置二、字体配置查看字体名称是否可以被识别&#xff1a;如果未能正确识别&#xff1a; 三、习惯配置四、快捷键配置更改提供的功能的快捷键&#…

【学习笔记】win11 时间显示秒

【学习笔记】windows 11 时间显示秒 原本一直用着 windows 10 的系统&#xff0c;点击右下角的托盘时钟&#xff0c;可以看到当前的秒数&#xff0c;平时拿来粗略的计时&#xff0c;看时间非常的方便&#xff0c;现在换成了 windows 11 的系统&#xff0c;点击右下角的托盘时钟…

如何处理前端本地存储和缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【Qt控件之QTabBar】介绍及使用

概述 QTabBar类提供了一个选项卡栏&#xff0c;例如用于选项卡对话框。 QTabBar非常简单易用&#xff0c;它使用预定义的形状绘制选项卡&#xff0c;并在选择选项卡时发出信号。它可以被子类化以调整外观和感觉。Qt还提供了一个实现好的QTabWidget。 每个选项卡具有一个tabT…

图——邻接表

图的邻接表表示法&#xff08;有向图&#xff09; 实现绿色的有向图 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <corecrt_malloc.h>#define Max 100//顶点数量最大值typedef struct ArcNode {//边信息int VNode_index;//顶点下标ArcNode…

MySQL索引全解:从理论到实践,打造高效查询的指南

文章目录 索引的数据结构Hash表有序数组树 详细聊聊BTreeBTree的特点树的度&#xff08;宽度&#xff09;可以很大叶子节点存储数据叶子节点双向指针记录 聚簇索引聚簇索引的优点聚簇索引的缺点 覆盖索引如何利用覆盖索引 普通索引与唯一索引的选择查询更新change bufferchange…

从入门到精通,30天带你学会C++【第八天:函数及洛谷精选题目讲解】(学不会你找我)

目录 Everyday English 前言 函数 洛谷 P5736 【深基7.例2】质数筛 分析题意 思路点拨 AC代码 AC截图 结尾 Everyday English Winners never quit! 胜者永不言弃&#xff01; 前言 这节课我们来学习函数&#xff0c;虽然我断更了几周&#xff0c;但我还是要把最…

三十六、【进阶】show profiles分析

1、profiles &#xff08;1&#xff09;详情 可以帮助清楚的展现&#xff0c;每一条SQL语句的执行耗时&#xff0c;以及时间都耗费到哪里去了 &#xff08;2&#xff09;基础语句 2、查看是否支持profiles mysql> select have_profiling; ------------------ | have_prof…

【LeetCode力扣】234 快慢指针 | 反转链表 | 还原链表

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、快慢指针反转链表 1、题目介绍 原题链接&#xff1a; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1]输出&#xff1a;true 示例 2&#xff1a; 输入&am…

自然语言处理---Transformer机制详解之ELMo模型介绍

1 ELMo简介 ELMo是2018年3月由华盛顿大学提出的一种预训练模型. ELMo的全称是Embeddings from Language Models.ELMo模型的提出源于论文<< Deep Contextualized Word Representations >>.ELMo模型提出的动机源于研究人员认为一个好的预训练语言模型应该能够包含丰…

42904-2023 金属和合金的腐蚀 海水管路动水腐蚀试验

1 范围 本文件规定了在天然海水或人工海水中控制流速、温度模拟管路动水腐蚀试验方法。 本文件适用于板状试样、管状试样及管件等在天然海水或人工海水中进行的管路动水腐蚀试验。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中…

在pytorch中对于张量维度的理解

原文参考链接&#xff1a; https://blog.csdn.net/qq_36930921/article/details/121670945. https://zhuanlan.zhihu.com/p/356951418 张量的计算&#xff1a;https://zhuanlan.zhihu.com/p/140260245 学习过程中对知识的补充学习&#xff0c;谨防原文失效&#xff0c;请大家支…

MySQL——练习

MySQL 一、练习要求二、练习过程 一、练习要求 创建表并插入数据&#xff1a; 字段名数据类型主键外键非空唯一自增idINT是否是是否nameVARCHAR(50)否否是否否glassVARCHAR(50)否否是否否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 21、创建一个可以统计…

探究物联网技术的核心知识点:传感器、嵌入式系统和数据分析

文章目录 &#x1f31f; 物联网技术&#x1f34a; 传感器&#x1f34a; 嵌入式系统&#x1f34a; 数据分析&#x1f34a; 总结 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约…

vue2 mixins混入

1.mixins混入 在vue中提供了一种复用性的操作&#xff0c;所混入的对象包含任意组件的选项&#xff08;data|computed&#xff0c;生命周期|watch&#xff0c;methods&#xff09; 2.mixins使用基本规则&#xff08;选项合并冲突&#xff09; data | computed&#xff1a;数据…

Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具

1. 前言 大家好&#xff0c;我是沙漠尽头的狼。 Dotnet工具箱是一个纯前端的、开源和免费的工具网站&#xff0c;周末我参考了开源项目it-tools&#xff0c;对网站界面文字进行了汉化&#xff0c;并重新部署了网站。该网站共有10大工具分类&#xff0c;提供了73个实时在线小工…

Java面向对象(基础)--package和import关键字的使用

文章目录 一、package关键字的使用1. 说明2. 包的作用3. JDK中主要的包 二、import关键字的使用 一、package关键字的使用 1. 说明 package:包package用于指明该文件中定义的类、接口等结构所在的包。语法格式 举例&#xff1a;pack1\pack2\PackageTest.java package pack1.…

PCB铺铜的那些事

PCB在所有设计内容都设计完成之后&#xff0c;通常还会进行最后一步的关键步骤&#xff0c;那就是铺铜。铺铜可以将主要的地&#xff08;GND&#xff0c;SGND&#xff08;信号地&#xff09;&#xff0c;AGND&#xff08;模拟地&#xff09;&#xff09;连接在一起。 在设计软件…

自动化运维ansible(ansible-playbook)

一、ansible-playbook的构成 Inventory&#xff1a;主机列表&#xff0c;表示剧本中的任务要应用在哪些主机上; Tasks&#xff1a;具体任务&#xff0c;即调用哪些模块完成操作&#xff0c;可以配置多个任务; Variables&#xff1a;变量&#xff0c;包含内置变量和自定义变量;…