IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 文件操作(C语言) -> 正文阅读

[C++知识库]文件操作(C语言)

为什么使用文件

在前面的学习中,我们写了通讯录的小程序[通讯录小程序],但是会存在一个问题,就是每次关闭程序,通讯录中的信息就会删除(内存还给操作系统),因此我们要保存通讯录中的信息就需要将信息放在文件中,实现持久化。

什么是文件

磁盘上的文件就叫做文件。但是在程序设计中,我们一般谈两种文件:程序文件、数据文件(从文件的功能角度来分类)。

程序文件

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

我们写代码中,会创建源代码:test.c,自定义头文件:test.h,可执行文件:test.exe(小黑框)。这些都是程序文件。

数据文件

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

我们写代码会将一些数据写进文件中,或者将文件读进程序中,这里涉及的文件都是数据文件。

文件名

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

文件的打开和关闭

文件指针

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


什么意思呢?
当我们操作文件data.txt时,我们需要先打开文件,再打开文件的同时,系统会自动创建一个结构体struct FILE,这个结构体所开辟的内存叫做文件信息区,里面有刚才data.txt中的相关信息,同时返回一个指针对该文件信息区进行操作,这时文件信息区就跟该文件形成了联系,我们对文件信息区进行操作,就会对该文件进行操作。

文件的打开和关闭

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

文件打开——fopen()函数

形式:FILE *fopen( const char *filename, const char *mode )
解释:const char *filename是文件的名称,const char *mode是打开的方式,常见的打开方式有“只读(r)”,“只写(w)”,“追加(a)”等。fopen()函数会返回一个FILE*的指针,如果文件打开失败,会返回一个空指针。

文件关闭——fclose()函数

形式:int fclose( FILE *stream )
解释:FILE *stream就是刚才返回的文件指针。
举个例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	//读文件
	//
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

当我们打开一个文件返回指针时,我们要进行判断,此时的指针是否为空指针,如果不为空指针,可以进行后续的操作,当关闭文件时,同样需要将指针置为空指针,防止对野指针的使用。

文件的顺序读写

功能函数名
字符输入函数fgetc
字符输出函数fputc
文本行输入函数fgets
文本行输出函数fputs
格式化输入函数fscanf
格式化输出函数printf
二进制输入fread
二进制输出fwrite

以fputc()输出函数举例:

#include<stdio.h>
int main()
{
	//打开桌面上的文件
	FILE* pf = fopen("C:\\Users\\蒋健\\Desktop\\data.txt","w");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	//写文件
	fputc('b', pf);
	fputc('i', pf);
	fputc('t', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在打开桌面上的文件后,对文件进行输出,fputc(‘b’, pf)就意味着将将‘b’的字符写入桌面上的文件,在对文件输入结束关闭文件,并将文件指针置为NULL指针。
我们再来看fgetc()输入函数为例:

#include<stdio.h>
int main()
{
	//打开桌面上的文件
	FILE* pf = fopen("C:\\Users\\蒋健\\Desktop\\data.txt","r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);
	ch = fgetc(pf);
	printf("%c\n", ch);
	ch = fgetc(pf);
	printf("%c\n", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

在这里插入图片描述
我们将文件改为“abcdef”,并将文件以只读的方式打开,用fgetc()输入函数,将字符按顺序输出并打印到屏幕上。
剩下的顺序函数读写,同学们可以利用MSDN自己研究,尝试输入或者输出。

文件的随机读写

fseek()函数

作用:根据文件指针的位置和偏移量来定位文件指针。
形式:int fseek ( FILE * stream, long int offset, int origin );
解释:FILE * stream也就是文件的指针,long int offset是偏移量的大小,int origin是指针的位置(取值为:SEEK_CUR,SEEK_END,SEEK_SET)

  • SEEK_CUR:当前指针位置
  • SEEK_END:文件末尾位置
  • SEEK_SET:文件开头位置

举个例子:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen:");
		return -1;
	}
	//读文件
	//int ch = fgetc(pf);
	//printf("%c\n", ch);
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
文件中我们存放“abcdef”,打开文件,并返回pf指针,此时pf指针指在文件开头位置,fseek(pf, 2, SEEK_SET)也就表明,从开头位置向后偏移2位(这里的SEEK_SET也可以换成SEEK_CUR),此时pf指向“c”,所以打印结果为c,当我们使用fgetc(pf)后,此时指针向后偏移1位,所以此时的pf指针指向“d”,fseek(pf, -2, SEEK_CUR)表示从此时pf指针向前偏移2位,也就是“b”的位置,因此打印结果为“b”。
在这里插入图片描述

ftell()函数

作用:返回文件指针相对于起始位置的偏移量
形式:long ftell( FILE *stream )
解释:FILE *stream就是文件指针。
举个例子:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen:");
		return -1;
	}
	//读文件
	//int ch = fgetc(pf);
	//printf("%c\n", ch);
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	int ret = ftell(pf);
	printf("%d", ret);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

前面的代码跟刚才的一样,当打印b后,此时的pf指针指向c,int ret = ftell(pf)计算此时的指针距离起始位置的偏移量,c距离起始位置的偏移量为2,所以打印结果为“2”。

rewind()函数

作用:让文件指针的位置回到文件的起始位置
形式:void rewind( FILE *stream );
解释:FILE *stream就是文件指针
举个例子:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen:");
		return -1;
	}
	//读文件
	//int ch = fgetc(pf);
	//printf("%c\n", ch);
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	int ret = ftell(pf);
	printf("%d", ret);
	rewind(pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

前面的代码跟上面的一样,rewind(pf)函数使用后,此时的文件指针回到文件开头位置。

文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转化的输出到外存,就是二进制文件。如果要求在外存上以ASCll码的形式存储,则需要在存储前转换。以ASCll字符的形式存储的文件就是文本文件。一个数据在内存中是怎样存储的呢?
字符一律以ASCll形式存储,数值型数据既可以用ASCll码形式存储,也可以使用二进制的形式存储。
比如:有整数10000,如果以ASCll形式输入到磁盘,则磁盘中占用5个字节,而以二进制形式输出,则磁盘只占4个字节。

文件读取结束的判定

关于文件读取结束的判定需要了解两个函数:feof()函数和ferror()函数,我们在读取文件的时候,会经历文件读取结束或者文件读取失败,这时候就需要判断是文件读取失败,还是文件读取结束,而判定就需要用到这两个函数:

  • feof()函数用途:是文件读取结束了,判断是不是遇到文件末尾而结束的。
  • ferror()函数用途:是文件读取结束了,判断是不是遇到错误而读取结束的。

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一个“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后在从缓冲区逐个地将数据送到程序数据区。
这样做的好处就是提高了操作系统与程序和文件之间的传输效率,就比如:同学向老师问问题,有一个问题,老师解答一个,这样老师和学生的效率都很低,但是学生攒到5个问题,一起问老师,老师效率提高了,同学的效率也提高了。
关于文件操作的知识点涉及的就是这么多了,如果有什么不到位或者需要改进的地方欢迎各位私信我。谢谢大家!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:05:38  更:2021-10-09 16:06:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:27:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码