C语言文件操作2

news2024/11/25 14:58:46

1.二进制读写函数

        在上一章我们介绍了字符读写函数、文本读写函数和格式化输入输出函数,这张我们继续为大家介绍剩下的一组读写函数——二进制读写函数:fread函数和fwrite函数。

fread函数

🟡函数作用

以二进制的方式从指定流中读取数据

🟢函数定义

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
  • void* ptr                存放读取数据的空间的起始地址
  • size_t size             读取元素的大小,单位为字节
  • size_t count          读取元素的个数
  • FILE* stream         与指定流关联的文件指针
  • size_t                     返回值,为读取成功的元素个数

通过函数定义我们再来讲解一下函数的作用:

        fread函数是从stream指向流中读取countsize大小的元素,将它们存放在ptr指向的空间里面,并且返回成功读取到的元素个数。

🟣函数使用

#include<stdio.h>
int main()
{
	int arr[4];
	//1.打开文件
	FILE* p = fopen("test2.txt", "rb");//以二进制读的形式打开文件
	//"test2.txt"文件中二进制的形式存放着1,2,3,4
	//检查文件是否打开成功
	if (p == NULL)
	{
		perror("fopen");//打印错误信息
		return 1;//终止程序
	}
	//2.二进制的方式读取,fread函数
	fread(arr, sizeof(arr[0]), 3, p);
	//存放读入数据的空间的起始地址,每个数据的大小,读入数据的个数,文件指针
	//都是以二进制的形式读取,读取为int类型的1是占4个字节,对应32个二进制位,就是将这32个二进制位读取到数组arr中去
	fclose(p);
	p = NULL;
	for (int i = 0; i < 3; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

🟤注意事项

  • 函数的返回值为成功读取到元素的个数,这个返回值可以和count进行比较,来验证是否全部读取成功。
  • fread函数不同于前面的字符、文本读取函数,该函数读取是原始的方式(字节的读取,二进制的读取),指定大小的读取,并非一个字节的字符,一整串字符的读取。

fwrite函数

🟡函数作用

以二进制的形式将数据写入到指定流中

🟢函数定义

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
  • void* ptr                存放写入数据的空间的起始地址
  • size_t size             写入元素的大小,单位为字节
  • size_t count          写入元素的个数
  • FILE* stream         与指定流关联的文件指针
  • size_t                     返回值,为写入成功的元素个数

通过函数定义我们再来讲解一下函数的作用:

        fread函数是stream指向流中写入countsize大小的元素,写入的数据是存放在ptr指向的空间里面,并且返回成功写入到的元素个数。

🟣函数使用

#include<stdio.h>
int main()
{
	int arr[4] = { 1,2,3,4 };
	//1.打开文件
	FILE* p = fopen("test2.txt", "wb");//以二进制写的形式打开文件
	//检查文件是否打开成功
	if (p == NULL)
	{
		perror("fopen");//打印错误信息
		return 1;//终止程序
	}
	//2.二进制的方式写入,fwrite函数
	fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), p);
	//写入数据的空间起始地址,每个数据的大小,写入数据的个数,文件指针
	//都是以二进制的形式写入,比如int类型的1是占4个字节,对应32个二进制位,就是将这32个二进制位进行写入
	fclose(p);
	
	p = NULL;
	return 0;
}

🟤注意事项

  • 函数的返回值为成功写入的元素的个数,这个返回值可以和count进行比较,来验证是否全部写入成功。
  • fwrite函数是将数据以它原有的形式写入到指定流中,比如int类型的1,是4个字节,原始类型就是31个0,1个1,就是将其二进制的形式写入流中。

2.随机读写操作

        在前面我们所学习的读写函数,都是从文件内容的起始位置开始进行操作,且每次使用完,文件指示光标会跳转指定位置(比如字符,操作一个光标向后移动),我们并没有指定到文件内容的位置,那么接着就来学习几个能操作文件的指示光标的函数。

我们先看下这几个函数以及作用:

函数作用含义
fseek文件的指示光标跳转到指定位置seek.寻找
ftell计算与光标起始位置的偏移量tell.计算,数
rewind文件的指示光标回到起始位置

fseek函数

🟢函数定义

int fseek ( FILE * stream, long int offset, int origin );
  • FILF* stream         要操作的文件的文件指针
  • long int offset       相对于origin的偏移量
  • int origin               文件光标的位置,规定只有一下三个值:
SEEK_SET文件的开头
SEEK_CUR文件当前的位置
SEEK_END文件的末尾
  • int 函数返回值,如果函数操作成功,返回0;如果操作失败,返回非零数。

🟣函数使用

  • 回到文件开头:将origin设置为SEEK_SET,offset设置为0,文件的指示光标就回到起始位置。
  • 定位到文件的某个位置:通过origin和offset两者值的配合,光标可以到达任何位置。
  • 从当前位置移动:如果想要在当前位置向左/右偏移,将origin设置为SEEK_CUR,将offset设置为要偏移量,左为负,右为正。
  • 追加内容:将origin设置为SEEK_END,offset设置为0,文件的指示光标就到了文件的末尾,此时就可进行追加操作。

🟤注意事项

  • 函数返回值为0意味着函数操作成功,为非零数意味着操作失败,可用返回值来检查操作。
  • fseek通常都是用于以二进制形式打开的流,此时函数的参数可以随意设置。
  • 当函数用于文本形式打开的流时,函数的参数就有要求,origin的值只能设置为SEEK_CUR,offset只能设置为0或调用ftell函数返回的值,就意味着对于文本文件调用时只能将文件的指示光标返回到文件的起始位置。

ftell函数

🟢函数定义

long int ftell ( FILE * stream );
  • FILE* stream         要计算偏移量的文件的文件指针
  • long int                  函数返回值,返回的是当前文件的指示光标距离文件开头的距离,单位为                                 字节;当操作失败时,返回返回长整型的-1,就是-1L。

🟣函数使用

【补充】

  • 返回当前位置:ftell函数通过返回一个长整型(long int)值,告知调用者当前文件指针的位置。
  • 错误处理:如果发生错误,ftell函数会返回-1L,并且全局变量errno会被设置为一个正值,以指示发生了错误。
  • 确定文件大小:结合fseek和ftell的使用,可以方便地计算出文件的大小。例如,先将文件指针移动到文件末尾,然后使用ftell获取当前位置,这个位置就是文件的大小。
  • 随机访问文件:在随机存取文件时,由于文件位置频繁前后移动,使用ftell可以轻松确定文件的当前位置。

🟤注意事项

  • 对于二进制流(文件以二进制形式打开的),ftell函数得到的是与文件开头的偏移量。
  • 对于文本流(文件以普通形式打开的),ftell函数得到的数值可能并无任何意义。

rewind函数

🟢函数定义

void rewind ( FILE * stream );
  • FILE* stream          要设置的流
  • void                        函数值为空,只是一段过程,进行设置文件光标回到文件的开头

🟣函数使用

//假设文件指针p指向的文件的指示光标已经偏移
rewind(p);//光标回到文件的开头

3.文件读写结束的原因

读写结束的原因分为一下两种:

  • 读写文件的过程中,到达文件的末尾。
  • 读写文件的过程中,文件发生错误。 

同样也配有两个函数来检查上面两种情况:

函数作用返回值
feof检查文件读写过程中是到达文件末尾到达末尾返回0,反之为非零值
ferror检查文件读写过程中是否出现错误没有错误返回0,反之为非零值

 除了这两种情况以外,我们还可以通过判断读写函数的返回值,来判断读写是否成功:

函数函数定义函数返回值
fgetcint fgetc ( FILE * stream )

成功返回读取到的字符的ASCII码值;

失败返回EOF

fputcint fputc ( int character, FILE * stream )

成功返回写入的

字符的ASCII码值;

失败返回EOF

fgetschar * fgets ( char * str, int num, FILE * stream );

成功返回str 

失败返回NULL

fputsint fputs ( const char * str, FILE * stream );

成功返回成功写入的字符的个数;

失败返回EOF

scanf家族int 名字( 指定位置, const char * format, ...);

成功返回成功输入的项数;

失败返回EOF

printf

家族

int 名字 ( 指定位置 const char * format, ... );

成功返回成功打印的项数;

失败返回负数

fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

返回读取到的元素的个数
fwritesize_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );返回成功写入的元素的个数

4.文件缓冲区

简单的讲一下:

        内存中的数据无法长久保存,想要永久保存,就需要将数据保存到磁盘上,那么内存就需要和磁盘打交道。

        当内存中的数据发生改变时,硬盘中的数据也必须跟着改变,如果内存中的数据频繁改变,磁盘中的数据也要跟着频繁的变,那么结果就是内存和磁盘频繁打交道。

        频繁的写入就会使得计算机的效率变低,此时就有了缓冲区的概念,数据先不直接磁盘/内存上,而是先放到缓冲区上,当缓冲区的数据被写满之后,再刷新到目标空间上,这就减少频繁的;输出输入,降低了硬件之间的访问频率,提升了效率。

缓冲区的大小是由C语言的编译系统来决定的


本章内容结束,下章见,拜拜!!!

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

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

相关文章

Nuxt3 实战 (三):使用 release-it 自动管理版本号和生成 CHANGELOG

release-it 能做什么&#xff1f; 增加版本号并提交 Git生成变更日志&#xff08;Changelog&#xff09;并提交到 Git创建 Git 标签并推送到远程仓库发布到 npm 等软件仓库在 GitHub、GitLab 等平台创建发行版 前置知识 在看这篇文章之前&#xff0c;我们有必要了解一下 Sem…

Java 那些诗一般的 数据类型 (下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

SpringBoot整合RabbitMQ-应答模式

一、应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。&#xff08;一般交换机发送消息&#xff0c;RabbitMQ只有在接收到消费者的确认后才…

【鸿蒙开发】ArkTS和组件

1. 初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性。 当前&#xff0c;ArkTS在TS的基础上主要扩展了如下能力&#xff1a; 基本语法&#xff1a;ArkTS定义了声明式UI描述、自…

终端进程“CWindowsSystem32WindowsPowerShellv1.0powershell.exe”已终止,退出代码 2。

终端进程“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”已终止&#xff0c;退出代码: 2。 今天安装了最新版的VScode&#xff0c;果然&#xff0c;出毛病了 在我每次运行终端运行vue3项目时&#xff0c;只要主动CtrlC退出&#xff0c;终端就会闪退&#xff…

2024洗地机哪个牌子好?六大避坑攻略总结

洗地机就像是吸尘器和电动拖把的结合体&#xff0c;对于每天要做家务的人来说&#xff0c;可以一次性解决多种类型的垃圾&#xff0c;省时省心省力。但是面对种类繁重的洗地机市场&#xff0c;大家时常会无从下手&#xff0c;今天笔者就给大家总结了六大洗地机避坑指南。 洗地…

购买了Hostease的企业邮箱服务后如何启用

最近有遇到客户购买了Hostease的企业邮箱后不知道该如何去启用的问题&#xff0c;这里我们简单分享一下Hostease的企业邮箱购买到使用的操作。 Hostease提供了两种邮箱服务套餐选择&#xff0c;OX App Suite和OX App Suite Productivity&#xff0c;OX App Suite Productivi…

Agent——客服机器人(大模型+本地数据/话术+在线数据库)

我们先来介绍一下&#xff0c;这个客服机器人的特点&#xff0c;根据本地资料&#xff0c;回答用户问题&#xff0c;告别传统机器人的答非所问&#xff0c;同时根据用户回答&#xff0c;判断用户意向度&#xff0c;并询问感兴趣用户的个人信息&#xff0c;获得后&#xff0c;保…

【面试题】如何在级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了…

关于pandas 无法读取 csv 文件数据的解决方式

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 …

Golang笔记(下)

Golang学习笔记&#xff08;下&#xff09; 前篇&#xff1a;Golang学习笔记(上) 十四、错误处理 14.1使用error类型 func New(text string) error例子&#xff1a; package mainimport ("errors" // 导入errors包"fmt" )func main() {var number, divi…

网页版五子棋对战实现和自动化测试

文章目录 前言一、项目描述项目演示链接 二、实现的功能与操作1.登录注册2.游戏大厅线程安全问题多开处理 3.五子棋对战 三、项目测试1.测试用例2.测试技术点3.部分测试用例展示&#xff08;1&#xff09;注册页面&#xff08;2&#xff09;登录页面&#xff08;3&#xff09;游…

ChatGPT与生成式AI:教育领域内新的浪潮与挑战

随着ChatGPT和其他生成式AI技术&#xff0c;如GPT-3.5、GPT-4的出现&#xff0c;我们正见证教育领域一场前所未有的变革浪潮。这些技术不仅推动了教育方式的进步&#xff0c;也为学习者带来了全新的机遇和挑战。 NO.1教育变革的新浪潮 生成式AI技术&#xff0c;特别是ChatGPT&…

【Nature Electronics】二维钙钛矿氧化物SNO作为high-κ栅介质的应用

【Li, S., Liu, X., Yang, H. et al. Two-dimensional perovskite oxide as a photoactive high-κ gate dielectric. Nat Electron 7, 216–224 (2024). https://doi.org/10.1038/s41928-024-01129-9】 概括总结&#xff1a; 本研究探讨了二维钙钛矿氧化物Sr2Nb3O10&#xf…

我们有了统一的Domino应用市场

大家好&#xff0c;才是真的好。 和大家一样&#xff0c;刚休假回来就发现HCL又上新了。这回是个大消息&#xff0c;直接上了一个Notes/Domino应用市场&#xff0c;地址是https://hclsofy.com/domino。 截至本篇写作时&#xff0c;提交到该市场的Notes/Domino相关扩展工具和应…

ATM04-6P 安费诺汽车连接器6芯压线端子胶壳

ATM04-6P是一款压线端子胶壳&#xff0c;属于Amphenol&#xff08;安费诺&#xff09;品牌 ATM04-6P 规格信息&#xff1a; 制造商:Amphenol 产品种类:汽车连接器 RoHS:是 产品:Connectors 位置数量:6 Position 型式:Receptacle (Female) 线规量程:22 AWG to 16 AWG 系列:ATM 颜…

layui后台框架,将左侧功能栏目 集中到一个页面,通过上面的tab切换 在iframe加载对应页面

实现上面的 功能效果。 1 html代码 <form class"layui-form layui-form-pane" action""><div class"layui-tab" lay-filter"demo"><ul class"layui-tab-title"><li id"a0" class"lay…

常见的mq产品和优点

常见的mq产品和优点 一、什么是mq? MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信&#xff0c;解耦。 二、常见的mq产品 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq …

基于51单片机轮胎胎压监测系统—数码管显示

基于51单片机轮胎胎压监测系统 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.MPX4115压力传感器胎压检测&#xff1b; 2.ADC0832进行模数转换后&#xff0c;51单片机处理控制&#xff1b; 3.数码管显示胎压&#xff…

谷歌留痕霸屏要怎么做?

谷歌留痕霸屏&#xff0c;就是让你的网站或者页面在谷歌搜索结果里尽可能多地出现&#xff0c;就像是在你的潜在客户眼前留下深刻印象一样&#xff0c;你要做的就是在一些高权重平台发布有价值的信息&#xff0c;同时巧妙地留下你的品牌名、产品名或者任何你想要推广的关键词&a…