【C语言】文件操作详细讲解

这篇具有很好参考价值的文章主要介绍了【C语言】文件操作详细讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章要分享的内容是C语言中文件操作的内容,为了方便大家学习,目录如下

目录

1.为什么要使用文件

2.什么是文件

2.1   程序文件

2.2 数据文件

2.3   文件名

3.文件的打开和关闭

3.1文件指针

 3.2打开和关闭

4.文件的顺序读写

4.1顺序读写函数介绍

4.1.1   fputc

4.1.2   fgetc

4.1.3   fputs

4.1.4    fgets

4.1.5  fprintf

4.1.6   fscanf


 文章来源地址https://www.toymoban.com/news/detail-414242.html

1.为什么要使用文件

我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。
我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。
这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2.什么是文件

我的回答是磁盘上的文件都是文件。

就是说打开你的电脑,你会看到电脑上有着C盘,D盘,或者还有的人买了容量更大的硬盘, 这些硬盘中所有的东西都可以被成为文件

但是在程序设计中,我们一般谈的文件有两种:程序文件,数据文件。

2.1   程序文件

包括我们写代码时的.c文件、.cpp文件,这些就被称为源文件。还有目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe),就是我们编写代码运行时所产生的文件都叫做程序文件

可以简单写个代码展示一下

【C语言】文件操作详细讲解

 然后再按照文件路径打开文件

 【C语言】文件操作详细讲解

我们就可以看到C Source就是上面所说的源文件

那么在进入Debug文件夹中

 【C语言】文件操作详细讲解

 就可以看到我们上面讲到的.exe文件和.OBJ文件,这些都是程序文件

2.2 数据文件

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

上面提到的通讯录时运行时只能存放在内存中使用,下次使用时内容就会丢失,所以要将其存放再硬盘上存放成文件才能想什么时候用就什么时候用,我们下面深度研究。

我们的代码在编译时会生成.exe文件,也就是我们在通讯录中增删改查的结果,那如何放到硬盘中呢?这里画图给大家展示

【C语言】文件操作详细讲解

 假如我要将生成的程序文件存放到硬盘中,也就是存放到.txt文件中,这样存放数据的就是数据文件。

  本篇具体要讲的就是写和读的操作

在这之前还需了解一些其他的东西

2.3   文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

那文件是怎么操作的呢?

3.文件的打开和关闭

打开文件和关闭文件就如同我们使用冰箱一样,要用文件夹里的东西首先要和使用冰箱一样,打开冰箱的们,然后使用里面的东西,最后再关上冰箱,也就是要关闭文件夹。这个操作可以是读,也可以是写,最后要关闭文件夹。

3.1文件指针

看到指针两个字可能有人就会想到之前学到的数组指针,函数指针等等的各种指针,但是其实文件指针和他们不一样,文件指针本身就是一种被定义好的类型的指针。 

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

给大家用图画来理解

【C语言】文件操作详细讲解

 图中的意思就是说当我们要对这个data.txt数据文件进行读或者写的操作时,它就会主动去维护一块内存,这块内存叫做文件信息区,这个文件信息去就是为了描述这块文件的,用来存放文件的信息,如文件的名字,文件状态及文件当前的位置等。

那这个文件信息区怎么再内存中呢?那就要用到FILE来开辟一段空间了

利用   FILE f  来开辟出这一段文件信息区,也可以将  f  理解为结构体变量,这个结构体的类型就是FILE。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,所以使用者不必关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量


定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

比如下图

【C语言】文件操作详细讲解

 3.2打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指
针和文件的关系。
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

示例

/打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

我们不妨到官网来看看两个函数的解析

【C语言】文件操作详细讲解

 可以看到有两个参数,第一个参数的意思就是文件名的意思,也就是你想操作的那个文件的名称,第二个参数是打开方式。有哪些打开方式呢?取决于你相对文件进行什么操作。

打开方式如下图

【C语言】文件操作详细讲解

 可以看到有非常多的不同的打开方式

这里为大家总结了几种

【C语言】文件操作详细讲解

 

接下来上手写代码

 

int main()
{
	//打开文件
	FILE* pf=fopen("test.txt", "w");
	//写文件

	//关闭文件
	return 0;
}

这就是一个以的方式打开一个文件

但是我们需要注意的是在我的文件路径下没有这个文件

【C语言】文件操作详细讲解

 这时就需要看上表的内容

【C语言】文件操作详细讲解没有我们想要打开的文件时,他就会建立一个新的文件,然后我们还要注意的是函数的返回类型,是一个指针类型,所以我们不妨

 定义一个FILE *类型的指针变量pf来接收,这时候是把我们上面讲过的文件信息区的地址放到pf里去,pf就可以找到文件信息区的地址,就可以找到文件并且操作文件。以上是打开文件操作

我们可以看到上面的操作对应表中会有出错的结果,如果打开文件失败的话就会返回一个空指针,所以我们要像以前一样对它的返回值加以判断

以下代码就是正常完整的打开文件的操作代码

int main()
{
	//打开文件
	FILE* pf=fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件

	//关闭文件
	return 0;
}

 

接下来是如何关闭文件

【C语言】文件操作详细讲解

 我们可以看到返回类型是一个整形,参数只需要将那个文件指针传过去即可

同时我们关闭文件后要避免野指针的使用,所以也要将其变为空指针。

这时候代码跑起来

【C语言】文件操作详细讲解我们就会再文件夹中找到我们所创建的文件 

【C语言】文件操作详细讲解

 就是那个大小为0kb的test.c文件。

那我们将写的形式改为以读的形式打开呢?表格上写的是出错

代码运行起来

【C语言】文件操作详细讲解

 可以看到将w改成r时,可以看到打开文件出错。

以上我们所说的打开test.c文件打开的路径时相对路径,也就是在当前的工程下区操作文件的

那如果要操作别的文件该怎么办呢?

这里我用桌面上的文件来演示

 【C语言】文件操作详细讲解

 桌面上有一个test.c文件,我们想要知道他的文件路径,可以右键打开她的属性

【C语言】文件操作详细讲解

这时我们就可以把他的文件路径拷贝到fopen函数的参数中

int main()
{
	//打开文件
	FILE* pf=fopen("C:\\Users\\19110\\Desktop\\test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件

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

【C语言】文件操作详细讲解

 可以看到打开成功了(因为是空文本,所以什么都没有)

当我们用写的操作打开后,也就是将  r  改为  w ,系统就会在桌面上新创建一个txt的文件,大家可以上手尝试一下。

以上就是打开和关闭文件的操作。

4.文件的顺序读写

4.1顺序读写函数介绍

接下来分享一些读写函数

【C语言】文件操作详细讲解

 我们可以看到每个函数都有不同针对的对象,有针对字符的,有针对文本行的,有针对格式化的和针对二进制的,我们一个一个来讲解。

4.1.1   fputc

首先是关于fputc

我们可以在官网查看一下关于fputc的信息

【C语言】文件操作详细讲解

我们可以看到这个函数的返回类型是整形,第一个参数是想要输出的字符,第二个参数就是文件指针,直接上代码给大家简单使用一下

int main()
{
	//打开文件
	FILE* pf=fopen("C:\\Users\\19110\\Desktop\\test2.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputc('a', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

可以看到我们在写文件的模块中使用了fputc,括号中的a就是我们想要输出的字符,pf就是我们想要操作的文件指针

代码运行起来

【C语言】文件操作详细讲解

 可以看到已经运行成功了

那再打开我们fopen中的文件看看有没有将a写入test文件中

【C语言】文件操作详细讲解

 我们可以看到a已经在test文件中了.

如果我们想输入一个字符串,比如二十六个应为字母,不妨使用while循环

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	//把二十六个英文字母写入
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

让代码走起来【C语言】文件操作详细讲解

 可以看到test文件里已经有我们写入的英文字母了。

注意(字符的本质就是ASCII码值,所以a可以和i相加)。

 

4.1.2   fgetc

接下来是读文件操作

可以观察官方对fgetc的描述

【C语言】文件操作详细讲解

 可以看到函数的返回类型是int类型,函数的参数是一个文件指针;

【C语言】文件操作详细讲解

官方的下面还有关于返回值是int类型的描述:如果读取时发生了错误,就会返回EOF,那EOF的值是-1,所以不仅仅会返回ASCII码值,还有可能返回-1,所以返回类型就定义为了int类型;

还是上面的代码我们对其进行改造

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);
//关闭文件
    fclose(pf);
	pf = NULL;
	return 0;
}

 我们将’w'改成'r',以读的方式来操作文件,这个文件放的就是我们写入的26个英文字母,

让代码走起来

【C语言】文件操作详细讲解

 这里可能会有疑问,为什么输出的不是aaaaaaaaa……呢?

这就是关于fgetc的一个特殊效果,每读取一次字符他就会向下一位移动,希望大家能够理解。

4.1.3   fputs

按照惯例先观察官网的资料

【C语言】文件操作详细讲解

 函数有两个参数,第一个参数是字符串,第二个参数是文件,返回类型是一个整形类型的数据

用代码来简单了解一下他的使用

int main()
{
	//读文件
	FILE* pf = fopen("text", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	fputs("hello world",pf);

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

代码运行起来观察

【C语言】文件操作详细讲解

我们看到已经写入成功了 

如果我们在下面再写入一次呢?

【C语言】文件操作详细讲解

 运行结果

【C语言】文件操作详细讲解

 当我们再次打开这个文件检查他们有没有写入时,你会发现他们出现在同一行了,想让他们出现再两行也很简单,只需要在后面加上\n即可

【C语言】文件操作详细讲解

 应该不难理解 

4.1.4    fgets

依然先观察官方给出的描述

【C语言】文件操作详细讲解

 可以看到函数的返回类型时char*的指针类型,参数 有三个,下面对他的参数内容也有介绍

【C语言】文件操作详细讲解

 

第一个参数意思是将第三个参数中的文件的字符串,拷贝到第一个参数中;

第二个参数意思就是说最多拷贝多少个字符到第一个参数中去(注意'\0'也算字符,所以要比你想拷贝的字符串多写一个数);

第三个参数就是要操作的文件

继续用代码简单使用,还是对我们刚刚创建好的文件进行操作;

int main()
{
	//打开文件
	FILE* pf = fopen("text", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读数据
	char arr[20];
	fgets(arr, 5, pf);
	printf("%s\n", arr);

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

运行结果

 

【C语言】文件操作详细讲解

 可以看到在函数中想拷贝5个字符,但是在输出结果中只有四个字符,这个函数在最后面放上了'\0'

应该不难理解

4.1.5  fprintf

先在观察官方对它的描述

先是fprintf

【C语言】文件操作详细讲解

 看到这个参数可能会有人一头雾水,那我们不如对比我们所学过的printf

【C语言】文件操作详细讲解

 你会发现参数就多了一个文件指针而已

【C语言】文件操作详细讲解

 

那么在使用的时候,我们只需要将printf中多加一个参数即可

 下面是简单的代码使用

struct S
{
	int n;
	float f;
	char arr[20];
};
int main()
{
	struct S s = {100,3.14f,"zhangsan"};
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf,"%d %f %s", s.n, s.f, s.arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

运行起来

【C语言】文件操作详细讲解

我们会发现已经写入在了对应的文件中 

4.1.6   fscanf

【C语言】文件操作详细讲解

 再对比一下我们先所学过的scanf

【C语言】文件操作详细讲解

 可以看到依然只是多了一个要操作文件的函数而已 

那我们用代码对其简单实用

struct S
{
	int n;
	float f;
	char arr[20];
};
int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf,"%d %f %s", &(s.n), &(s.f), s.arr);
	printf("%d %f %s", s.n, s.f, s.arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

可以看到在最开始时我们将结构体的内容初始化为0 ,因为我们要用函数去读取这个文件中本身的内容,也就是我们上面用fprintf所写入的文件。

我们在读取成功后,再将其读到的内容打印出来

让代码跑起来

【C语言】文件操作详细讲解

 可以看到这个文件的信息已经全部被读取出来了。

以上就是本次所要分享的内容,如果对你有所帮助,不妨三连支持,感谢您的阅读。

 

 

到了这里,关于【C语言】文件操作详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】文件操作重点内容梳理

    本文目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 文件的打开和关闭 2.1 文件指针 2.2 文件的打开和关闭 3. 文件的顺序读写 3.1 顺序读写函数介绍 4. 文件的随机读写 4.1 fseek 4.2 ftell 4.3 rewind 5. 文本文件和二进制文件 6. 文件读取结束的判定 6.1 被错误使用的 feof  7

    2024年02月14日
    浏览(40)
  • 【C语言】高效处理文件内容:C语言的文件操作技巧与窍门

    目录 一、文件分类 1、按存储介质分类 2、按存储方式分类 二、文本文件 三、二进制码文件  四、二进制和文件文件的区别  五、文件缓冲区   1、文件缓冲区的刷新方式 2、模拟时钟 3、文件指针 六、文件的API 1、打开文件fopen 2、关闭文件 fclose 3、逐个字符读写 fgetc fputc

    2024年02月15日
    浏览(44)
  • 初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(57)
  • 如何使用 Python 操作 .npy 文件?详细教程分享

    如何使用 Python 操作 .npy 文件?详细教程分享 .npy 文件是指 NumPy 存储数组数据的文件格式,它具有快速、高效和易存储等优点。在科学计算和机器学习领域中,.npy 文件的使用非常普遍。如果想要对 .npy 文件进行读写操作,Python 语言和 NumPy 库提供了很多便捷的方法。 下面,

    2024年02月09日
    浏览(58)
  • 【玩转Linux操作】详细讲解Shell的函数,exit,文件重定向,引入外部脚本的操作

    🎊专栏【​​​​​​​玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 bash 中的函数类似于C/C++中的函数,但是 return 的返回值与C/C++不同,返回的是 exit code ,取值为0~255,

    2024年02月12日
    浏览(41)
  • 文件详细操作过程(C语言)

    🌞🌞🌞 千淘万漉虽辛苦 🌞🌞🌞 🌞🌞🌞 吹尽狂沙始到金 🌞🌞🌞 所谓“文件”一般指:存储在外部存储介质上数据的集合。操作系统是以文件为单位对数据进行管理的,如我们用word写的一篇文章、用C语言编的一个程序要保存在磁盘上都有必须以文件的形式,并且给相应

    2024年02月06日
    浏览(33)
  • C语言文件操作(超详细)

    🍕博客主页:️自信不孤单 🍬文章专栏:C语言 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏+关注 本文主要介绍C语言中文件操作的相关内容(例:文件读、写等相关函数)。 文件是以计算机硬盘为载体存储在计算机上的信息集合。是数据源的一种,最主要的作用

    2023年04月12日
    浏览(37)
  • C语言——文件操作(超全超详细)

    磁盘上的文件是文件 但是在程序设计中,我们一般谈的文件有两种: 程序文件、数据文件 (从文件功能的角度来分类的) 1.1 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe) 1.2 数据文件 文件的内容不一定是程

    2024年02月04日
    浏览(43)
  • 【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        在上一篇博客中,我们学习了一些 自定义类型

    2024年02月08日
    浏览(38)
  • 万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)

    前言:Hello,大家好😘,我是心跳sy,上一节我们主要学习了格式化输入输出的基本内容,这一节我们对格式化进行更加深入的了解,对文件概念进行介绍,并且对输入、输出与文件读写的基本概念进行学习,本节主要对printf,scanf深入了解,并介绍文件处理函数,如fprintf,

    2024年02月13日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包