C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

2023-11-12

前言

有了文件的顺序读写基础,那么肯定会好奇文件的随机读写,毕竟顺序读写对于有些操作场景来说实在是不方便。

文件指针之所以能够顺序读写是因为文件类型内部有一个位置指示器,我们只能对位置指示器指向的地方进行读写。

文件的随机读写就是将文件的位置指示器设置成我们想要的值,然后进行读写操作。

fseek 重定位位置指示器函数

函数描述:

在这里插入图片描述

设置位置指示器的位置

其中的 offset 可以是负数, origin 只能是上面三个宏。

// demo
// test.txt :> "abcdef"

printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
fseek(pf, 2, SEEK_CUR);
printf("%c", fgetc(pf)); // f

ftell 获取当前文件指示器的位置

函数描述:

在这里插入图片描述

返回流的当前位置指示器的位置

返回值Return Value

成功时,返回位置指示器的当前值。

失败时,返回-1Lerrno设置为系统特定的正值。

// demo
// test.txt :> "abcdef"

printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
printf("%d\n", ftell(pf)); // 3

rewind 重置位置指示器

函数描述:

在这里插入图片描述

将与流关联的位置指示器设置为文件的开头

// demo
// test.txt :> "abcdef"

printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
printf("%d\n", ftell(pf)); // 3
rewind(pf);
printf("%d\n", ftell(pf)); // 0

文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

数据在内存中的存储形式:

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

在这里插入图片描述

文件读取结束的判定

  1. 文本文件读取是否结束,判断返回值是否为EOF ( fgetc ),或者NULL ( fgets )
    例如:

fgetc 判断是否为EOF .
fgets 判断返回值是否为NULL .

  1. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:

fread判断返回值是否小于实际要读的个数。

feofferror

feof 函数描述:

在这里插入图片描述

如果遇到文件末尾结束,返回非0,否则返回0

ferror 函数描述:

在这里插入图片描述

如果遇到读取错误结束,返回非0,否则返回0

// demo
enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = {1.,2.,3.,4.,5.};
	FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
	fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
	fclose(fp);
	
	double b[SIZE];
	fp = fopen("test.bin","rb");
	size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
	
	if(ret_code == SIZE) // 本次读取成功
	{
		puts("Array read successfully, contents: ");
		for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
		putchar('\n');
	} 
	else 
	{ // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) 
		{
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。这样的缓冲区策略可以减少程序的IO次数,从而提高效率。

在这里插入图片描述

// demo

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
int main()
{
	FILE*pf = fopen("test.txt", "w");
	
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	
	return 0;
}

所以在进行完文件操作后需要将文件关闭。不然将会导致数据的丢失。

总结

文件的操作相对来说有点繁琐,并且需要谨慎选择库函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】 的相关文章

随机推荐

  • 浅谈 SOLID 原则的具体使用

    单一职责原则 SRP 开放封闭原则 OCP 里氏替换原则 LSP 接口隔离原则 ISP 依赖倒置原则 DIP 小结 SOLID 是面向对象设计5大重要原则的首字母缩写 当我们设计类和模块时 遵守 SOLID 原则可以让软件更加健壮和稳定 那
  • 物理机重启后ES无法访问

    问题 机房断电 重启机器后 Elasticsearch 集群无法访问 集群状态访问如下 可以访问 9200 端口 目测 Elasticsearch 是正常的 但是查看集群状态报错 报错内容 error root cause type mas
  • Python 实现简单的自定义异常类型

    usr bin env python import os socket errno types tempfile class NetworkError IOError pass class FileError IOError pass de
  • threadx系统_小熊派带你初探最近叱咤风云的ThreadX全家桶

    一 前言 1 1 ThreadX操作系统简介 去年微软宣布收购ThreadX 但是没有公布后续策略 uCOS全家桶进入开源免费后 ThreadX也宣布正式加入 微软未来四年将投资50亿美元到物联网上 收购Express Logic是该战略的
  • 取代 C++,Google 强势开源 Carbon语言

    整理 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 每一种编程语言都曾想一统江湖 将其他语言取而代之 但事实上 能够在众多竞争者中脱颖而出并雄霸一方天地并非易事 今天 谷歌重磅公开了其内部建立的最新编程语言 Carbon 剑指
  • 神经风格迁移——基于VGG算法

    本文是基于吴恩达 深度学习 卷积神经网络第四周习题而做 神经风格迁移的效果是将A图片的某些特征迁移到B图中 使B图具有与之相同的风格 具体的讲解可以观看达叔 深度学习 教程 所需的第三方库如下 其中所用的数据集和辅助程序可点击此处下载 im
  • CSSS样式穿透

    在使用 CSS 样式时 有时候我们希望修改子组件中的样式 但是由于 CSS 的层叠规则 子组件的样式可能会被父组件的样式所覆盖 这时可以使用 CSS 样式穿透 CSS style piercing 来解决这个问题 CSDN上面大多数都是使用
  • 体积

    题目描述 问题描述 给出 n 件物品 每件物品有一个体积 V i 求从中取出若干件物品能够组成的不同的体积和有多少种可能 输入格式 第 1 行 1 个正整数 表示 n 第 2 行 n 个正整数 表示 V i 每两个数之间用一个空格隔开 输出
  • 8-窗口、窗口控件、对话框以及相关功能类-对话框QDialog

    对话框QDialog 对话框 QDialog 是顶层窗口 主要用于短期任务和与用户的简短通信 所谓的顶层窗口 就是可以显示在所有窗口的最前面 也有另一种说法 是指没有父类的窗口 例如 有些警告窗口始终显示在屏幕顶端 直到被用户关闭 QDia
  • java中yield(),sleep()以及wait()的区别

    往往混淆了这三个函数的使用 从操作系统的角度讲 os会维护一个ready queue 就绪的线程队列 队列 是先进先出的 FIFO 并且在某一时刻cpu只为ready queue中位于队列头部的线程服务 但是当前正在被服务的线程可能觉得cp
  • 微信 history.back 时候的 缓存问题处理, 最近搞得我很头疼

    最近在写微信的项目 遇到一个很坑爹的问题 为了更好的用户体验 我希望在项目中 点击返回按键的时候能返回到 某一个指定的页面 返回某些页面的时候页面不缓存 jsp 页面缓存 src 请求缓存 ajax 请求缓存 主要操作的 api 有 pop
  • Ubuntu安装deepin-wine并安装微信

    安装deepin wine 只需要简简单单的三个命令 git clone https gitee com wszqkzqk deepin wine for ubuntu git cd deepin wine for ubuntu insta
  • mysql之union合并查询

    转载链接 http www cnblogs com zzwlovegfj archive 2012 06 23 2559592 html union 联合的意思 即把两次或多次查询结果合并起来 要求 两次查询的列数必须一致 推荐 列的类型可
  • 8.21作业

    双线程拷贝 include
  • IDEA中配置文件格式为UTF-8

    1 第一个需要设置文件编码格式的位置 File gt Settings gt Editor gt File Encodings 2 第二个需要设置文件编码格式的位置 每个项目中的 idea文件夹中的encodings xml文件打开进行文件
  • zTree节点重叠或者遮挡

    ztree官网 http www treejs cn v3 api php 问题 zTree节点重叠或者遮挡 分析 由于zTree和bootstrap插件样式冲突导致的树重叠问题 解决 设置zTreeStyle css文件的 ztree l
  • 机器人比赛对青少年成长的意义

    机器人比赛主要考核参赛选手的实际操作 科学素养 团队合作 创新思维 项目与时间管理和语言表达等能力 格物斯坦小坦克认为以比赛的形式给学生们提供一个交流科学技术的平台 激发学生的潜能 锻炼实际动手能力 培养学生临场随机应变的灵活思维 在提升比
  • 本地部署你的专属ChatGPT,不用想方设法翻墙了

    自ChatGPT问世以来 由于安全问题ChatGTP始终没有在国内提供服务 那访问ChatGTP有条件的就通过专线到国外进行访问 没条件的但喜欢折腾的可以通过各种野路子科学上网 没条件不喜欢折腾的听听就行 无意间在gitHub上发现了一个开
  • MySQL-DDL语句

    MySQL DDL语句 数据库操作语句 增删数据库 查看数据库列表 创建数据库 进入 使用 数据库 查看当前所在的数据库 查看数据库的建库语句 查看数据库的编码集和校验集 删除数据库 修改数据库的编码集 查看数据库支持的编码集和校验集 数据
  • C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

    全文目录 前言 fseek 重定位位置指示器函数 ftell 获取当前文件指示器的位置 rewind 重置位置指示器 文本文件和二进制文件 文件读取结束的判定 feof 和 ferror 文件缓冲区 总结 前言 有了文件的顺序读写基础 那么