C语言:文件操作(二)

目录

前言

4、文件的顺序读写

4.1fputc

4.2 fgetc

4.3 fputs

4.4 fgets

 4.5 fprintf

4.6 fscanf

4.7 fread和fwrite

结(二)


前言

        接者“C语言:文件操作(一)”往下讲。

        本篇文章将介绍C语言的文件操作,在后面的内容讲到:为什么使用文件;什么是文件;文件的打开和关闭;文件的顺序读写;文件的随机读写;文本文件和二进制文件;文件读取和结束的判定;文件缓冲区。详细讲述了C语言的文件操作。此内容将分成三篇讲解,这是第二篇。

4、文件的顺序读写

        顾名思义,按照顺序对文件进行读写,就是文件的顺序读写。下面会具体讲解。我们先来看看主要的函数:

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

4.1fputc

        fputc的参数有两个,第一个参数是要输入的字符的ASCII码,第二个参数是要输入文件的文件指针。

        下面举一个例子:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	char i = 0;
	for (i = 'a';i <= 'z';i++)
	{
		fputc(i, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        这样的代码运行,我们发现在程序的路径下会多出一个文件:

        这个文件打开后发现内容正式我们在程序中对文件的输入。

        这是因为本身我们程序路径下是没有文件“test.txt”的,所以当我们以写的形式(“w”)去打开文件时,电脑就会在当前路径下创建一个文件“test.txt”,然后我们在后面利用fputc函数将“a”到“z”的字符输入到了该文件,因此文件内的内容就是“a”到“z”。

        fputc就讲到这,下面讲它相对的一个函数,fgetc。

4.2 fgetc

         fgetc的参数只有个就是文件指针,这个函数功能就是按顺序输出文件的内容,当输出失败时返回EOF。利用这个特性我们可以写一个函数。

#include<stdio.h>
#include<string.h>
#include<errno.h>

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	int ch = 0;
	while ((ch  = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果如下:

        我们读取了刚刚用fputc创建的文件“test.txt”,然后再通过fgetc的特性:在没有输出时返回EOF。我们将循环的条件改为,当fgetc返回值为EOF时停止,这样就能访问文件的所有内容。于是就产生的上面这样的效果。

4.3 fputs

        fputs的参数有两个,和foutc类似,只不过第一个参数是要输入的字符串的首地址而不是字符的ASCII码。第二个参数是要输入的文件的文件指针。

        看代码:

#include<stdio.h>
#include<string.h>
#include<errno.h>

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	fputs("hello world", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果就是在当前路径下的文件“tese.txt”的内容改成hello world

        没错,它会销毁文件之前的内容(之前本来内容是“a”到“z”),如果想在原来文件内容不变的情况下进行追加内容,那适用fopen函数时,应该以"a"的形式打开文件(追加形式)。

4.4 fgets

        读一行fgets有两个参数,第一个参数是读取的内容要存放的空间(这个要提前给创建好),第二个参数是要读取得字符个数,第三个参数是要读取得文件的文件指针。

        下面看例子:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	char arr[20] = { 0 };
	fgets(arr, 5, pf);

	printf("%s", arr);
	
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果:

        发现只读了四个字符,这是因为需要有一个字符放'\0',所以,读n个字符,得到的其实n-1个字符加一个'\0'。

 4.5 fprintf

        我们发现不管用fputc还是fputs,都只能对字符进行一个写入,如果要对其他类型进行写入的话,我们就需要用到fprintf。

        fprintf的参数类比printf,比printf在最前面多一个参数:FILE*类型的参数。其实就是在原来printf函数前补充一个文件指针,下面看个例子就明白了:

        

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件

	fprintf(pf , "%s %d %f", s.arr,s.age,s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        这个例子,我先创建了一个结构体struct S,然后初始化了一个结构体变量s,后通过fprintf函数将其三个内容写入文件“test.txt”,我们发现fprintf其实就是比printf多加一个参数文件指针,就可以把内容打印到文件当中去,效果如下:

4.6 fscanf

        同理,fscanf和scanf很像,就是在它前面加了一个文件指针的参数。

        下面看一个例子:

        

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件

	fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
	printf("%s %d %f", s.arr, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        利用一下我们刚刚创建好的文件,看看效果:

        我们这样就把文件的内容读出来了。

        剩下的两个函数:fread和fwrite是二进制的读和写,将数据转化为二进制之后进行读写。且对象只能是文件。

4.7 fread和fwrite

        先看fwrite:

        这里有四个参数,首先知道第四个参数是文件指针,然后我们来看第一个参数,第一个参数是要写入的内容的地址,第二个参数是要写入的数据大小,第三个参数是要写入的数据个数。

        下面看程序:

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan" , 25, 50.5f };

	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        这里要注意:我们打开文件的方式应该是wb:以二进制的方式打开。

        看效果:

        我们发现有些东西我们看不懂,这是因为我们放进去的是二进制,所以我们无法看懂,但由于“zhgangsan”我们以文本和以二进制的方式放进去是一样的,所以显示出来我们看得懂。

        虽然我们看不懂这个函数,但我们可以用fread把他读取出来,fread正好可以读取二进制的数据。

        fread:

        fread有四个参数,其实我们发现fread和fwrite的参数是一样的,只是作用相反。

        看代码:

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果:

        虽然二进制方式放进去我们看不懂,但是我们可以用fread把他读出来。

        二进制写进去文件可能会小一些,但也不一定,看情况,所以按什么方式放数据到文件里面,需要我们自己根据情况去判断。

结(二)

        C语言:文件操作(二)的内容,就到此,后续会继续讲解后面的内容。希望本篇文章对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法每日一练]-数论(保姆级教程 篇1 埃氏筛,欧拉筛)

目录 保证给你讲透讲懂 第一种&#xff1a;埃氏筛法 第二种&#xff1a;欧拉筛法 题目&#xff1a;质数率 题目&#xff1a;不喜欢的数 思路&#xff1a; 问题&#xff1a;1~n 中筛选出所有素数&#xff08;质数&#xff09; 有两种经典的时间复杂度较低的筛法&#xff0…

靶向载药脂质体纳米药物载体应用领域

【中文名称】 载药脂质体 【纯 度】 95%以上 【保 存】 4℃保存 【溶 剂】 PBS或者水 【无菌处理】 是 【规 格】 50mg&#xff0c;10mg/ml 【品 牌】 碳水科技&#xff08;Tanshtech&#xff09; 载药脂质体是一种利用脂质双层囊泡包裹药物分子以实现有效…

计算机网络:数据链路层 - 可靠传输协议

计算机网络&#xff1a;数据链路层 - 可靠传输协议 可靠传输概念停止-等待协议 SW回退N帧协议 GBN选择重传协议 SR 可靠传输概念 如下所示&#xff0c;帧在传输过程中受到干扰&#xff0c;产生了误码。接收方的数据链路层&#xff0c;通过真伪中的真检验序列 FCS 字段的值&…

【Linux】-进程知识铺垫①计算机硬件的组织:冯诺依曼体系结构详细解读②关于操作系统对软硬件及用户的意义

目录 ​编辑 1.关于计算机的体系结构 1.1 冯诺依曼体系结构的诞生 2.冯诺依曼体系结构 2.1 cpu:运算器&#xff1a;更多的是让cpu具有特殊的数据计算功能&#xff1a; 2.2 控制器 2.3输入设备 2.4输出设备 3.计算机各个硬件设备之间的关系 4.内存与计算机效率 5.关于为什么总说…

Spoon Taking Problem(c++题解)

题目描述 &#xfffd;N 人が円卓に座っており&#xff0c;各人は反時計回りに順に 1, …, &#xfffd;1, …, N と番号付けられています&#xff0e;各人はそれぞれ左右どちらか一方の利き手を持っています&#xff0e; 円卓上には 1, …, &#xfffd;1, …, N と番号付け…

【Linux】详解动态库链接和加载对可执行程序底层的理解

一、动静态库链接的几种情况 如果我们同时提供动态库和静态库&#xff0c;gcc默认使用的是动态库。如果我们非要使用静态库&#xff0c;要加-static选项。如果我们只提供静态库&#xff0c;那可执行程序没办法&#xff0c;只能对该库进行静态链接&#xff0c;但程序不一定整体…

为移动云数据实现基于可撤销属性组的加密:多代理辅助方法

参考文献为2023年发表的Achieving Revocable Attribute Group-Based Encryption for Mobile Cloud Data: A Multi-Proxy Assisted Approach 动机 对于目前的代理辅助的可撤销基于属性加密来说&#xff0c;外包解密存一些缺点。当多个具有相同属性的用户请求外包转换时&#x…

核心API-Activiti7从入门到专家(3)

背景 今天的说的api&#xff0c;activiti7真有&#xff0c;但真不是这个&#xff1a; 这个是为了云服务&#xff0c;封装的一些api&#xff0c;以后我们还会逐步探讨&#xff0c;今天我们讨论的&#xff0c;是其真正的api&#xff0c;以前是这样的&#xff1a; 是的&#xff0…

ChatGPT 登陆报错:“Oops, an error occurred!” 如何解决?

ChatGPT登录时报错&#xff1a;“Oops, an error occurred!” 说明&#xff1a;哎呀&#xff0c;出错了! 原因&#xff1a; 目前出现这个情况的小伙伴&#xff0c;并非账号被封&#xff0c;多是服务端的问题&#xff0c;比如高峰段&#xff0c;服务端响应不及时&#xff0c;负…

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…

leetcode代码记录(打家劫舍 III

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xf…

【数据结构】——二叉树的递归实现,看完不再害怕递归

创作不易&#xff0c;感谢三连加支持&#xff1f;&#xff01; 一 递归理解 递归无非就是相信它&#xff0c;只有你相信它&#xff0c;你才能写好递归&#xff01;为什么&#xff1f;请往下看 在进入二叉树的实现之前&#xff0c;我们得先理解一遍递归&#xff0c;可能很多…

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

网络基础二——TCP可靠性实现机制补充

11.3.4确认应答机制 ​ 1.双方通信时要返回确认应答报文&#xff0c;保证对方发送的报文是有效的&#xff1b;尽管整个通信过程中无法保证数据全部可靠&#xff0c;但是可以保证单个方向发送的数据是可靠的&#xff1b; ​ 发送的报文要设置序号&#xff0c;如果是应答报文要…

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

设计模式总结-面向对象设计原则

面向对象设计原则 面向对象设计原则简介单一职责原则单一职责原则定义单一职责原则分析单一职责原则实例 开闭原则开闭原则定义开闭原则分析开闭原则实例 里氏代换原则里氏代换原则定义里氏代换原则分析 依赖倒转原则依赖倒转原则定义依赖倒转原则分析依赖倒转原则实例 接口隔离…

React 入门

一、官网地址 英文官网: https://reactjs.org/中文官网: https://react.docschina.org/ 二、React 特点 声明式编码组件化编码React Native 编写原生应用高效&#xff08;优秀的 Diffing 算法&#xff09;高效的原因&#xff1a;1.使用虚拟DOM&#xff0c;不总是直接操作页面…

Navicat Premium 16 Mac/win---数据库设计、管理与维护轻松掌握数据库管理精髓

Navicat Premium是一款功能强大的数据库开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Redis、MariaDB、Oracle等&#xff0c;并可与云数据库兼容&#xff0c;如Amazon RDS、Microsoft Azure等。它提供了直观易用的用户界面&#xff0c;使得开发者能够轻松上手并…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…