【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)

在这里插入图片描述

前言

在之前的学习过程中,我们所编写的程序在执行过程中所产生的数据及结果都只是临时存放在内存区域,一旦程序运行结束,该程序所涉及的内存空间全部返回给操作系统。这时候如果我们想要去查看这些数据和结果,显然是做不到的!那有没有什么方法能够解决这个问题呢?也就是说可以将程序运行过程所产生的过程数据和结果数据都保存起来,即便程序结束,我们也可以找到这些内容,甚至是在之后所写的其他程序中也能继续使用这些内容。
答案当然是-- - 有,这也就是我们这篇文章所要讨论的东西–文件。



为什么需要文件?

这个问题其实刚刚已经说到了,简而言之,我们需要文件是
(1)防止程序结束后,数据就消失了
(2)为了持久化的保存数据


什么是文件?

计算机中所说的文件是以计算机硬盘为载体,存储在计算机上的信息集合。例如我们熟悉的文本文件,图片文件,视频文件,程序等等。
文件有各种各样的类型,但是在程序设计中,我们一般谈的文件有两种∶程序文件、数据文件
(1)程序文件
包括源程序文件(后缀为.c ), 目标文件(windows环境后缀为.obj), 可执行程序(windows环境后缀为.exe)。
(2)数据文件
文件的内容不是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本章讨论的是数据文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。


文件名

如果我们要区分不同的人,很多时候需要通过他 / 她的名字来进行区分;如果要区分不同的物品,也要通过不同的物品名称来区分一样。所以为了区分不同的文件,也需要给不同的文件不同的名称一样。
一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分∶文件路径 + 文件名主干 + 文件后缀
例如︰c : \code\test.txt
文件路径:c : \code
文件名主干:test
文件后缀:.txt

为了方便起见,文件标识常被称为文件名。但是我们要了解此时所称呼的文件名,实际上包括以上3部分内容,而不仅仅是文件名主干。

1) 文件名主干的命名规则遵循标识符的命名规则。
2)后缀用来表示文件的性质, 如:doc(Word生成的文件), txt(文本文件),dat(数据文件), c(C语言源程序文件)'cpp(C++源程序文件), for(FORTRAN语言源程序文件),pas(Pascal语言源程序文件),obj(目标文件), exe(可执行文件).ppt(电子幻灯文件), bmp(图形文件)等。
3)文件路径:分为相对路径和绝对路径
绝对路径:c : \code\test.txt
相对路径:test.txt


文件缓冲区

ANSIC标准采用"缓冲文件系统"处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
在这里插入图片描述


文件指针

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

例如VS2013编译环境提供的stdio.h头文作中有以下的文件类型声明:

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

(注意:以上代码了解即可,有兴趣可自行研究) 不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。 下面我们可以创建─个FILE* 的指针变量:

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

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


文件的打开和关闭

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

fopen

函数原型:FILE* fopen(const char* filename, const char* mode);
函数功能:Open a file.(打开文件)
返回类型:Each of these functions returns a pointer to the open
file.A null pointer value indicates an error.(如果打开成功,返回指向文件信息区的指针,如果返回失败,返回空指针NULL)
函数参数1:filename(文件名,实际上包括3部分内容,而不仅仅是文件名主干。如果文件路径未写,则默认本路径)
函数参数2:Type of access permitted(文件打开方式)

文件打开方式如下表:
在这里插入图片描述

注意:‘w’打开的时候如果有同名文件,该文件中的内容会被销毁

fclose

函数原型:int fclose(FILE* stream);
函数功能:Closes a stream(fclose) or closes all open streams(_fcloseall).(关闭文件)
返回类型:fclose returns 0 if the stream is successfully closed._fcloseall returns the total number of streams closed.Both functions return EOF to indicate an error(关闭文件成功返回0,关闭文件失败返回EOF(值为 - 1)来报错)
函数参数:Pointer to FILE structure(文件指针)

举例:
1)在项目工程所在文件路径下新建一个测试文件
在这里插入图片描述
2)测试代码

#include<stdio.h>
int main()
{
   
	//打开文件
	FILE* pf1 = fopen("test1.txt", "r");
	if (pf1 == NULL)
	{
   
		perror("fopen");
		return 1;
	}
	//写文件
	//......
	//关闭文件
	fclose(pf1);
	return 0;
}

3)文件打开结果
在这里插入图片描述
调整一下(为了进一步理解相对路径和绝对路径,这里的filename使用绝对路径的方式)
在这里插入图片描述
刚刚我们是以“读”的方式来打开文件,现在我们来尝试用“写”的方式来打开文件

#include<stdio.h>
int main()
{
   
	FILE* pf = fopen("file1.dat", "w");
	if (pf == NULL)
	{
   
		perror("fopen");
		return 1;
	}
	//写文件
	//... 
	printf("open file success!\n");
	//关闭文件
	fclose(pf);
}

在我们刚刚的路径下是没有file1.dat这个文件的,因为我们用“w”的方式打开文件,所以会创建一个新的文件
在这里插入图片描述
在这里插入图片描述
现在我们来尝试将一些内容写入到打开的文件中:

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 非常感谢您的建议,我们会考虑为大家提供一篇关于C语言入门学习笔记C语言是一门非常重要的编程语言,它广泛应用于操作系统、嵌入式系统、游戏开发等领域。对于初学者来说,学习C语言可以帮助他们掌握编程的基本概念和技能,为以后的学习打下坚实的基础。 在这篇学习笔记中,我们将介绍C语言的基本语法、数据类型、运算符、控制语句、函数等内容。我们会从简单的例子开始,逐步深入,帮助大家理解C语言的核心概念和编程思想。我们还会提供一些练习题,帮助大家巩固所学知识。 希望这篇学习笔记能够对初学者有所帮助,让大家更好地掌握C语言编程。如果您有其他建议或意见,欢迎随时联系我们。 ### 回答2: 作为一门计算机语言,C语言的使用广泛且重要,即便现在有许多其他语言的存在,但学习C语言仍然是计算机学习的必经之路。如今,学习C语言也方便了许多,因为有许多教学资源都是免费的。比如那些像《C语言入门这一篇就够了-学习笔记》这样的教学资源,它们都是由专业人士撰写的教材或教程,比较全面地讲解了C语言的基础知识、重要概念、应用场景等等。在许多情况下,这些资源甚至可以替代正式的计算机课程。 《C语言入门这一篇就够了-学习笔记》更像是一份学习笔记,但它却给使用者提供了许多有关学习C语言时深入思考的信息和提示。在这份文档中,讲解C语言基础知识的同时,也对C语言常用函数做了简单的讲解。此外,该文档还特别提到了如何阅读错误信息和如何进行Debug工作,这对学习C语言的初学者来说尤为重要。 在实际的编程过程中,C语言的知识是必不可少的。尽管现在各种编码语言都有自己的粉丝群体,但是对于技术人员来说,学习C语言仍是一项至关重要的任务。该语言的使用可以帮助我们更好地了解计算机,使我们对编程概念和计算机原理有更深入的理解。从这个角度来看,《C语言入门这一篇就够了-学习笔记》是一份非常有用的资源,尤其是对那些希望打好C语言基础和学习编程的初学者来说,它将是一个非常好的学习工具。 总之,《C语言入门这一篇就够了-学习笔记》这份文档内容通俗易懂,适合初学者,但它并不是唯一的学习资源。对于那些希望深入学习C语言的学生,还需要更多的学习材料以及更多的实践机会,那样才能真正掌握和熟练应用C语言。 ### 回答3: C语言是实现高效编程的一种常用编程语言。学习C语言,对于初学者来说是个具有挑战性的过程,需要花费大量的时间和精力。在这篇C语言入门学习笔记中,简明扼要地介绍了学习C语言的几个基本方面,包括C语言的基本语法、数据类型、运算符、控制语句、数组和指针等。 首先,C语言的基本语法是需要掌握的。了解C语言的基本语法对于编写代码非常重要。这篇学习笔记首先介绍了C语言的源文件结构和注释。在实际编写代码的时候注释中的内容非常重要,需要保证代码的可读性和可维护性。此外,学习C语言的前身C++和Java也都有很多相似的语法结构。 其次,数据类型是C语言中的重要概念之一。C语言有多个原生的数据类型,同时也可以通过结构体等方式创建自己的数据类型。在学习C语言中,需要注意各个数据类型的使用范畴和数据长度等。 运算符是C语言中实现计算的重要手段之一,了解不同的运算符和运算顺序对于编写代码非常重要。控制语句的使用也需要注意,可以通过if、for、while等语句来控制程序的运行次数和顺序,从而实现各种不同的功能。 数组和指针是C语言中另外两个非常重要的概念。数组可以对大量数据进行处理,比较灵活。指针是C语言中常用的一种内存管理机制,不同的指针类型可以指向不同的数据类型,可以更加灵活地管理内存。 综上所述,学习C语言需要具有较好的编程能力,同时也需要多练习和思考。这篇学习笔记中介绍了C语言的一些基本概念和实现方式,希望可以为初学者提供更多的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我叫张同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值