文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)

news2024/11/15 17:57:27

        前言:在我们写的程序的的时候,数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,那么如果要将数据进行持久化的保存,我们就可以使用文件进行存储数据。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

那么废话不多说,我们直接开始讲解,我将会从一下三个方面进行讲解:

目录

1.文件的基础认知

        (1)文件的分类 

        (2)文件名

        (3)二进制文件和文本文件

        (4)文件指针

2.文件的操作流程

        (1)打开文件

        (2)关闭文件

        (3)文件的读取和输入

3.实例:操作文件

        (1)fputc函数

        (2)fgetc函数

        补充:

        (3)fputs函数

        (4)fgets函数

        补充:



1.文件的基础认知

        在讲解文件的基础认知之前,首先让我们了解一下什么是文件:

文件:磁盘(硬盘)上的文件就是文件,它是在计算机中以实现某种功能、或某个软件的部分功能为目的而定义的一个单位。

       

        (1)文件的分类   

         了解了什么是文件之后,那么文件有哪些分类呢?一般来讲文件分为两种:

        1.程序文件:程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)

        2.数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件

       

        (2)文件名

        像人一样,每一个文件都有其名称,即文件名:

        (3)二进制文件和文本文件

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

        二进制文件:在储存到外存是将二进制数据不进行转换,数据在内存中以二进制的形式存储就是二进制文件

        文本文件:在储存到外存是将二进制数据进行转换,以ASCII字符的形式存储的文件就是文本文件

               例如:

用一句话分别是二进制文件还是文本文件:就是看其储存到外存中时有没有进行转换。

        (4)文件指针

        在介绍文件指针之前,让我们先了解一下什么是文件信息区:

        文件信息区:当我们在使用文件的时候,编译器都会创建一个其对应的文件信息区,它是用来存放文件的相关信息的(如文件的名字,文件状态及文件当前的位置等),这些信息是保存在一个结构体变量中(该结构体类型是由系统声明的),并且使用typedef重命名为FILE

这是Visual Studio中的文件信息区:

struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;

注:不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

了解了什么是文件信息区之后,我们在讲解一下文件指针,文件指针,顾名思义就是存放文件地址的指针,每当我们打开一个文件的时候,它就会返回文件信息区的指针,这时我们就可以使用文件指针接收它,并通过文件指针间接的操作与它关联的文件。

以上我们就初步了解了有关文件的基础认知。

2.文件的操作流程

        操作文件大致分为三步:打开文件、操作文件、关闭文件

        (1)打开文件

我们可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,该函数会返回一个文件指针:

该函数的第一个参数是你想要打开的文件的文件名(例如:“ c:\code\test.txt ”),第二个参数为你想要对该文件进行的操作,大致的操作方式有如下几种:

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件

“ab”(追加)

向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“a+”(读写)打开一个二进制文件,在文件尾进行读写建立一个新的文件

注意:文件的使用方式是使用双引号(“  ”),而不是单引号!!!

        现在我们使用实例来使你更好的进行理解:

#include<stdio.h>
int main()
{
    //创建一个文件名为text.txt的文件
	FILE* p = fopen("text.txt", "w");
    //防止打开失败返回空指针
    if (p == NULL)
    {
        perror("fopen");
        return 1;
    }
   
	return 0;
}

注:当我们打开 / 创建一个文件之后都要对文件指针进行判断,判断其是否为NULL指针,如果为NULL指针,就没有必要进行下面的操作了,就直接退出程序即可。

上面的代码中我对每一步进行了讲解,使你能更好的理解如何打开文件。

以上我们就完成了文件的打开 / 创建。

        (2)关闭文件

在对文件操作完成之后,就要进行关闭的操作,为了关闭文件,我们就要使用 fclose( ) 函数。函数的原型如下:

该函数的参数为你要关闭的文件的文件指针(FILE类型指针),我们直接使用实例来深入理解。

继续对上面的代码进行关闭操作:

#include<stdio.h>
int main()
{
    //创建一个文件名为text.txt的文件
	FILE* p = fopen("text.txt", "w");
    //防止打开失败返回空指针
    if (p == NULL)
    {
        perror("fopen");
        return 1;
    }
    //关闭文件
    fclose(p);
    p = NULL;
	return 0;
}

注意:当我们关闭文件的时候,由于该文件已被关闭,那么FILE类型的文件指针变为了野指针,所以这时我们要将文件指针置为NULL。

以上我们就完成了文件的关闭。

        (3)文件的读取和输入

        现在我们已经了解了文件如何创建 / 打开和关闭,那么操作文件的最重要的部分——读取和输入该如何操作呢?

        首先我们要知道操作文件的几个函数:

函数名功能适用性
fgetc()字符输入函数所有输入流
fputc()字符输出函数所有输出流
fgets()文本行输入函数所有输入流
fputs()文本行输出函数所有输入流

先大体看一下有哪些函数,下面会进行详细讲解!

3.实例:操作文件

        (1)fputc函数

先看一下官网对其的解释:

该函数的第一个参数是你想存入文件的字符,第二个参数是该文件的文件指针,返回值为存入字符的ASCII码值。

我们直接使用实例来加深对其的理解:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符Z存入文件名为test.txt的文件
	fputc('Z', pf);
	fclose(pf);
	pf = NULL;

	return 0;
}

这样我们就将字符Z存入了文件。

        (2)fgetc函数

先看一下官网对其的解释:

该函数的参数为要读取的文件的文件指针,返回值为为读取的字符的ASCII码值。

注:当读取失败或者读取到文件末尾时会返回EOF(本质是-1)

我们直接使用实例来加深对其的理解:

我们继续使用上面例子中的文件(其中我们存放了字符 Z )

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读取文件名为test.txt的文件中的字符
	int ch = fgetc(pf);
	printf("%c", ch);
	fclose(pf);
	pf = NULL;

	return 0;
}

这样我们就获取了文件中的字符。

        补充:

我们可以使用fgetc函数将文件中的字符一个一个的获取出来,达到获取文件中所有内容的目的。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//获取文件中的所有内容
	int ch = 0;
	while (((ch = fgetc(pf)) != EOF))
	{
		printf("%c", ch);
	}
	fclose(pf);
	pf = NULL;

	return 0;
}

我们知道当读取失败或者读取到文件末尾时才会返回EOF,所有我们使用EOF作为判断依据循环获取字符即可,这样我们就可以获取文件中所有内容了。

       

        (3)fputs函数

先看一下官网对其的解释:

该函数的第一个参数为一个字符指针,即你可以将想写入文件的字符串的首地址传入,第二个参数为你想写入的文件的文件指针。

我们直接使用实例来加深对其的理解:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt","w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//该字符串为要写入的字符串
	char str[] = "hello world";
	fputs(str, pf);
	fclose(pf);
	pf = NULL;

	return 0;
}

这样我们就将字符串成功写入文件中了。

        (4)fgets函数

先看一下官网对其的解释:

该函数的第一个参数为一个字符指针,这里你要填入的是一个容器地址,该容器用来存放读取出的字符串,第二个参数为要读取的字符串的长度,第三个参数是想要读取字符串的文件的文件指针,该函数的返回值为一个字符指针。

注:当读取成功时,返回的为读取到的字符串的地址,如果读取失败或者读取到文件末尾,则返回NULL指针。

我们直接使用实例来加深对其的理解:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//存放返回字符串的容器
	char str[20];
	//读取数据
	fgets(str, 10, pf);
	printf("%s", str);
	fclose(pf);
	pf = NULL;

	return 0;
}

从结果中我们发现了一个问题——我想让它读取10个字符,但是为什么它只读取了9个呢?其实该函数就是会读取你所想让它读取的字符长度 -1 个字符,因为该函数会留一个字符用来放入‘ \0 ’。

这样我们就完成了从文件中读取字符串的任务。

        补充:

我们也可以使用该函数来读取文件中的所有内容。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//存放返回字符串的容器
	char str[20];
	//读取文件中的所有数据
	while (fgets(str, 10, pf) != NULL)
	{
		printf("%s", str);
	}
	fclose(pf);
	pf = NULL;

	return 0;
}

这里我们使用其如果读取失败或者读取到文件末尾才返回NULL指针的特性完成了读取文件所有内容的操作。


以上为文件操作(上)的所有内容了~~~

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

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

相关文章

逻辑解析(logical decoding)

pg_create_logical_replication_slot select * from pg_replication_slots; select pg_export_snapshot(); select pg_create_logical_replication_slot(‘logical_slot1’, ‘test_decoding’); CREATE TABLE t_logical(id int4); pg_logical_slot_get_changes SELECT *…

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈&#xff0c;一直next即可。

操作系统的理解|冯·若依曼体系结构|进程的状态

操作系统的理解 冯诺伊曼体系结构为什么必须通过内存然后到cpu存储金字塔冯诺伊曼结构的改进在哪&#xff1f;我们可不可以全部用寄存器来做存储器在硬件数据流动角度学以致用&#xff1a;解释程序运行为什么要加载到内存程序没被运行之前存在哪里&#xff1f; 操作系统概念广义…

H5小程序视频方案解决方案,实现轻量化视频制作

对于许多企业而言&#xff0c;制作高质量的视频仍然是一个技术门槛高、成本高昂的挑战。针对这一痛点&#xff0c;美摄科技凭借其深厚的技术积累和创新能力&#xff0c;推出了面向企业的H5/小程序视频方案解决方案&#xff0c;为企业提供了一种轻量化、高效、便捷的视频制作方式…

flutter布局更新

理论上&#xff0c;某个组件的布局变化后&#xff0c;就可能会影响其他组件的布局&#xff0c;所以当有组件布局发生变化后&#xff0c;最笨的办法是对整棵组件树 relayout&#xff08;重新布局&#xff09;&#xff01;但是对所有组件进行 relayout 的成本还是太大&#xff0c…

目前2024年腾讯云4核8G服务器租用优惠价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现纳米级时间同步&#xff0c;车载以太网多通道交换&#xff0c;Bypass数据采集和监控等功能&…

B2 PRO WordPress主题:多功能商用主题,助力资讯、资源、社交、商城、圈子、导航一站式解决

B2 PRO WordPress主题&#xff1a;多功能商用主题&#xff0c;助力资讯、资源、社交、商城、圈子、导航一站式解决 一、产品概述 B2 PRO WordPress主题&#xff0c;作为一款多功能商用主题&#xff0c;致力于为用户提供一站式的内容管理与网站建设服务。它集资讯发布、资源共享…

4.常用CMD命令

扩展一个小点&#xff1a; 在很多资料中都说成是DOS命令&#xff0c;其实是不对的。真正的DOS命令是1981年微软和IBM出品的MS-DOS操作系统中的命令才叫做DOS命令。 而在Windows中&#xff0c;win98之前的操作系统是以非图形化的DOS为基础的&#xff0c;可以叫做DOS命令。到了…

精酿啤酒:特殊酵母的发酵特性与风味表现

Fendi Club啤酒在酿造过程中采用了特殊的酵母&#xff0c;这些酵母具有与众不同的发酵特性和风味表现&#xff0c;为啤酒带来了与众不同的风味和口感。 Fendi Club啤酒使用的酵母种类繁多&#xff0c;包括艾尔酵母和拉格酵母等。这些不同种类的酵母在发酵过程中具有不同的特性和…

unity学习(70)——编译游戏发生错误2

1.全屏问题其实无所谓&#xff0c;windows用tab可以切出来的。 2.现在主要问题是服务器try了以后虽然不崩溃了&#xff0c;但不再显示2个实例对象了&#xff0c;unity和exe此时都只能看到一个实例对象 2.1把之前报错位置的try-catch先注释掉 2.2 unity中此时登录666账号&…

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法&#xff1a;在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后&#xff0c;将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置&#xff0c;产生排序好的子…

java-获取1688网站商家信息----简单应用

1.下载google浏览器 注: 苹果电脑下载 旧版本google浏览器 点设置时会自动更新, (卸载重装),运行时版本和驱动不匹配会报错 第三方网站下载链接:旧版本(安装后老是提示更新,最新版本没有找到对应的驱动,不能更新它) Google Chrome 64bit OS X版_chrome浏览器,chrome插件,谷歌浏…

基于Springboot的疫情隔离酒店管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情隔离酒店管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

奶瓶哪个牌子的比较好?适合新生儿的奶瓶分享

每一位新手家长都要选购很多东西&#xff0c;而必备的无疑就是新生儿奶瓶了。如果你不知道要给宝宝选什么品牌的奶瓶好&#xff0c;不懂哪些材质符合安全无毒标准。那么收藏这篇文章就对了&#xff0c;作为一名测评博主&#xff0c;我近期测评了多款全网热议的奶瓶&#xff0c;…

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

[HackMyVM]靶场quick5

kali:192.168.56.104 靶机:192.168.56.134 端口扫描 # nmap 192.168.56.134 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-27 19:08 CST Nmap scan report for careers.quick.hmv (192.168.56.134) Host is up (0.000056s latency). Not shown: 998 closed tcp p…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码