首页 > 编程语言 >编程之路,从0开始:文件操作(2)

编程之路,从0开始:文件操作(2)

时间:2024-11-24 15:57:58浏览次数:6  
标签:文件 读取 int 编程 二进制 pf 操作 include

        Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

        今天我们来继续学习C语言的文件操作。

a84c1562898745a2848eab9ff220bec3.gif我的博客:<但凡.

我的专栏:编程之路

持续更新高质量内容,欢迎点赞、关注!

目录

1、文件的随机读写

1.1 fseek

1.2 ftell

输出结果:​编辑

1.3 rewind

2、文件读取结束的判定

测试一:文本文件读取结束

测试二:二进制文件读取结束

3、文件缓冲区


 

1、文件的随机读写

        上一篇我们介绍的各种函数都是顺序读写函数,现在我们来看几个随机读写函数。

1.1 fseek

        这个函数可以根据文件指针的位置和偏移量来定位文件指针。

5a33711d92bc4b5f895306653b663542.png        在cplusplus.com上,我们可以看到对这三个参数的介绍:

27b0db57e00a4277973fc80c8dc121de.png

        第一个参数就是文件指针,没什么好说的,毕竟通过上节课的学习我们发现这种文件操作函数基本都要输入文件指针。

        第二个参数是偏移量参数,可以为正数,也可以为负数。

        第三个参数起始位置,我们可以看到C语言为我们提供了三个起始位置(如上图),

  • 文件头 SEEK_SET 0
  • 当前位置 SEEK_CUR 1
  • 文件尾 SEEK_END 2

我们现在上手演示一下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf=fopen("test.txt", "wb");//打开文件
	int i = 0;
	if (pf != NULL)
	{
		char c[100] = { 0 };
		strcpy(c, "passion");
		fputs("add passion", pf);
		fseek(pf, 4, SEEK_SET);
		fputs("PASSION", pf);
		fclose(pf);//关闭文件
	}
	return 0;
}

运行后文件内容:

0fcc8dd053ac4331a7a00f18f382db79.png

        在这串代码中,我们先把add passion输入到文本中,然后再将光标从文件起始位置向后移四位(四个字节),这时光标在p前边。我们从光标处对光标以后文字进行了更改。

1.2 ftell

        这个函数可以返回文件指针相对于起始位置的偏移量。

9cb15d4a87414d6987d6a01663c881ba.png        我们直接传如文件指针就行,他会检测光标位置并返回光标位置相较于文本最开始的偏移量。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf=fopen("test.txt", "r");//打开文件
	int i = 0;
	if (pf != NULL)
	{
		char c[100] = { 0 };
		strcpy(c, "passion");
		fputs("add passion", pf);
		fseek(pf, 4, SEEK_SET);
		int size = ftell(pf);
		printf("%d", size);
		fclose(pf);//关闭文件
	}
	return 0;
}

输出结果:
d61cadc3994e420a9ebf0083ae16a113.png


1.3 rewind

这个函数可以让文件指针的位置回到文件的起始位置。

2ed7492905ae49afae3c475c85837bd2.png

这个就不做代码演示了哈~,很简单的。

2、文件读取结束的判定

        我们都知道,EOF是文件结束的标志,那么feof呢?

        首先我们要弄清楚一个东西:不能用feof的返回值直接来哦按段文件是否结束。feof的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。

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

        2、二进制文件的读取结束判断。判断返回值是否小于实际要读的个数(fread)。


废话也不多说,我们直接举例来测试测试:

测试一:文本文件读取结束

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf=fopen("test.txt", "r");//打开文件
	int i = 0;
	if (pf != NULL)
	{
		char c;
		while ((c = fgetc(pf)) != EOF)
		{
			putchar(c);
		}
		if (ferror(pf))
		{
			puts("I/0 error when reading");
		}
		else if (feof(pf))
		{
			puts("End of file reached successfully");
		}
		fclose(pf);//关闭文件
	}
	return 0;
}

输出结果:

225bf5626eb2425fb02ad9b39e868c98.png        我们文件里的文本为test,他输出我们的文本后打印了End of file reached successfully,说明遇到EOF的原因是文件结束,也就是feof的返回值为真。

测试二:二进制文件读取结束

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	double a[5] = { 1,2,3,4,5 };
	FILE* pf=fopen("test.bin", "wb");//打开文件,以二进制形式
	fwrite(a, sizeof * a, 5, pf);//写入数组
	fclose(pf);
	
	double b[5];
	pf = fopen("test.bin", "rb");//只读形式打开
	size_t ret_code = fread(b,sizeof *b,5,pf);//读数组,并放入b数组中
	if (ret_code == 5)//如果fread返回值(从文件中读取的字节数)==5,说明读取完毕
	{
		puts("Array read successfully,contents: ");
		for (int n = 0;n < 5;n++)
		{
			printf("%f", b[n]);//打印b数组
		}
		putchar('\n');
	}
	else
	{
		if (ferror(pf))
		{
			puts("I/0 error when reading");
		}
		else if (feof(pf))
		{
			puts("End of file reached successfully");
		}

	}
	fclose(pf);//关闭文件
	return 0;
}

输出结果:

d9b18180811e44bbbb9a94735be0ce5e.png    

        这里首先我要跟大家说明一点,我们上篇介绍的fread和fwrite函数他们的功能是二进制输入和输出。也就是说,他们能更改二进制文件。但是上节课我们让他们更改的是txt文件,因为数据以二进制的形式存储,你以二进制形式更改他们,在打开txt文件时,他们会自动转化成我们能够读懂的数据。

        那么在这我创建的是bin二进制文件,常用的文本编译器根本就打不开它,如果你费尽心思打开了他,你也根本读不懂他想表达的意思,因为那是给计算机读的,不是给人看的。

3、文件缓冲区

        在C语言文件操作时,其实我们读取文件内容和输入内容到文件时,并不是直接对其进行操作的,而是通过文件缓冲区操作的。

b5528a1bb6164eeb9adbb3013ca23d12.png

        那么我们为什么要有这么一个缓冲区呢?我们带入生活,如果你要搬家,是一个物品一个物品的般好还是把所有物品都装车,一次性运过去好呢?当然是一次性运过去好啊!同样,我们把像输入的字符一个一个先放入缓冲区,等到积攒到了一定的数量,再把缓冲区的字符一次性放到硬盘中,这样就能减少系统的运行压力。

        好了,今天的内容就分享到这,觉得有帮助的老铁点带你关注支持一下,我们下次再见!

 

标签:文件,读取,int,编程,二进制,pf,操作,include
From: https://blog.csdn.net/2401_87995839/article/details/143993517

相关文章

  • Windows 的复制和粘贴功能是基于 文件系统操作(如 CopyFile 或 MoveFile API)来实现的,而
    在Windows操作系统中,复制粘贴功能和robocopy(RobustFileCopy)技术的使用场景和目标不同,这也是为什么微软在日常用户界面中选择使用传统的复制粘贴(Copy-Paste)功能,而不是直接依赖robocopy技术的原因。下面我将从几个关键角度进行详细分析。1. 目标用户与应用场景不同复制粘......
  • 异或神操作_二进制底层
    二进制的基础java里位运算符是对补码处理的,java里取反符号~会导致符号位改变计算机里采用补码存储数值对于正数,其补码、原码和反码都是相同的。即,正数的补码就是其本身。对于负数,补码的计算过程相对复杂一些,但遵循固定的步骤:求原码:负数的原码是其绝对值的二进制表......
  • Fastadmin框架短视频知识付费系统存在任意文件读取漏洞
    免责声明:本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在使用本......
  • shell编程for循环和while循环
    声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,也欢迎大家本人公众号:泷羽Sec-track,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!网安工具:......
  • MybatisPlus入门(七)MybatisPlus-DQL编程控制(上)
     一、查询条件设置查询条件如下图:  用户登录(eq匹配),代码示例:LambdaQueryWrapper<User>lqw=newLambdaQueryWrapper<User>();//等同于=lqw.eq(User::getName,"Jerry").eq(User::getPassword,"jerry");UserloginUser=userDao.selectOne(lqw);System.o......
  • Python编程整理汇总(基础汇总版)
    1.基础语法1.1变量与数据类型整数:a=10浮点数:b=3.14字符串:c="Hello,World!"布尔值:d=True列表:e=[1,2,3,4,5]元组:f=(1,2,3)字典:g={"name":"Alice","age":25}集合:h={1,2,3,4,5}1.2控制结构if语句:ifa>......
  • Ghostscript 是一个开源的解释器,用于处理和操作 PostScript(PS)和 PDF 文件。它主要用于
    Ghostscript是一个开源的解释器,用于处理和操作PostScript(PS)和PDF文件。它主要用于将这些文件格式转换为其他格式(如图像、PDF、PostScript),或者将它们打印出来。Ghostscript可以作为独立的程序运行,也可以嵌入其他应用程序中,提供打印、渲染和转换功能。为什么使用Ghostscript?......
  • Accessibility.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Accessibility.dll文件(挑选合适的版本文件)......
  • 【轻量级 Java Web 整合开发(第 2 版)-框架编程技术】-期末复习(第二版)
    第一章JavaWeb技术概述作业1、完成课后(P28)选择题和问答题(只需完成,不需要提交)2、Tomcat的目录结构及其用途?bin:启动/关闭应用服务器的bat批处理命令;conf:包含不同的配置文件。包括server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件we......
  • 【一箭三雕战法】一线穿三板,擒妖捉牛好战法,技术构成和操作买卖要点图文教程
    一箭三雕,现实生活中,经常听到一石二鸟,一箭双雕这样的成语,比喻某种技能或计谋,能够达到超出常规的效果,让人惊喜!一箭三雕战法是一个实战效果非常好的股市战法,一般来说,只要指数环境不是太差,一箭三雕战法的准确率在90%以上,而且很有可能抓到的是主升浪或能够实现翻倍的大牛股。......