首页 > 其他分享 >文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)

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

时间:2024-03-27 19:58:05浏览次数:23  
标签:文件 读取 函数 pf 操作 想要 NULL 指针

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


✨✨✨这里是秋刀鱼不做梦的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指针的特性完成了读取文件所有内容的操作。


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

标签:文件,读取,函数,pf,操作,想要,NULL,指针
From: https://blog.csdn.net/2302_80198073/article/details/137074324

相关文章

  • 文件宝App如何使用smb功能(Mac电脑)
    1.Mac电脑“系统设置”->“通用”->"共享"到达下面页面(或系统设置页面直接搜索“文件共享”到达页面)。然后点击①所示按钮 2.然后在弹出页打开②所示开关,点击③所示"选项"按钮3.弹出的页面打开④所示开关,然后勾选⑤所示账户,勾选时可能会需要输入开机密码。最后依次点“完成......
  • 【Postman如何进行接口测试简单详细操作实例】
    1、下载Postmanpostman下载地址:DownloadPostman|GetStartedforFree2、安装Postman(1)双击下载好的postman-setup.exe文件,进行安装postman工具(2)安装完成后,在桌面找到并打开postman软件,输入邮箱和密码进行登录,没有就新建注册一个账号,登录进入到postman首页。3、大......
  • 【Python系列】Python 中 YAML 文件与字典合并的实用技巧
    ......
  • Python中的datetime模块:轻松拿捏时间操作
    前言在Python中,处理日期和时间是非常常见的任务,无论是在开发Web应用程序、数据分析还是其他领域。datetime模块为我们提供了丰富的功能,可以轻松处理日期和时间,从简单的日期算术运算到复杂的时区转换,应有尽有。本文将深入探讨datetime模块的功能和用法,帮助大家轻松拿捏时间操作。......
  • navcat 导入csv 文件乱码或者导入xlsx文件中文乱码
    原因是,编码错误,默认导入的是utf-8,但是Excel文件里面一般是按照ascll码存的,所以我们将它另存为文件然后在哪里修改编码值 先在记事本中打开: 然后文件——》另存为编码改成utf-8 然后再导入过程中;如果还是有问题一般考虑字符太长了:这时候我们在导入导向中,将所有列的类......
  • 解决idea显示properties文件中文乱码
    解决idea显示properties文件中文乱码在项目中通常会遇到如下问题,突然properties文件中文就显示为\u5730等等这样类似的字符 解决方法如下1、File-》Settings-》FileEncodings,修改如下图中绿框标注的内容 2.点击Apply-》Ok3.修改完成后显示如果项目中存在多个propertie......
  • 几种靠谱的企业大文件安全传输方式,最后一种绝了
    在数字化的浪潮中,企业的数据安全传输显得尤为关键。随着远程办公和云技术的普及,企业在保护敏感信息不被外泄方面面临着新的挑战。本文将探讨几种有效的企业数据安全传输方法,并着重阐述其中一种方法如何作为全面的解决方案,提供既高效又安全的数据传输服务。数据安全传输的策略和......
  • 901-深入浅出Python量化交易实战的配套视频和代码(段小手)中文PDF+源代码(源文件)
    小瓦的故事——从零开始本书源于一个真实的故事,故事的主角是一位名叫小瓦的姑娘。小瓦出生在一个普通的家庭,父母都是老实淳朴的普通人,靠着并不丰厚的收入把小瓦养育成人。18岁那年,小瓦考上了一所不好不坏的大学,所学专业是一个就业前景算不上理想的专业。再加上她本身也谈不......
  • Qt 操作sql server数据库
    Qt操作sqlserver数据库添加qtsql的库连接数据库QSqlDatabase_db=QSqlDatabase::addDatabase("QODBC");_db.setHostName();_db.setDatabaseName();_db.setUserName();_db.setPassword();_db.setPort();_db.open();增QSqlQueryquery;query.prepare("INSER......
  • Sql server 2019 文件夹共享方式异地备份遇到的问题
    1、无法找到路径'\\192.168.66.50\share_domain\2、该作业失败。 无法确定所有者WIN-DOAR3JOEG2C\Administrator(拥有作业Mofang异地差异备份.Subplan_1)是否有服务器访问权限(原因:无法获取有关WindowsNT组/用户'WIN-DOAR3JOEG2C\Administrator'的信息,错误代码0x54......