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语言之文件操作

文件是由文件路径+文件主干+文件后缀组成的。文件又被分为文本文件和二进制文件,两种区别就在于文本文件是给人看的,二进制文件是给机器看的,该文章主要说明了对一个文件的操作,是一个文件就会用于存放数据,将文件中的信息输入输出也是我们要掌握的。C语言的文件操作,是用于用户保存信息,和整理信息的一种方法,可以让不想被销毁的信息保留到下次打开可执行程序里面还有之前的内容。

如何把信息放入文件呢?

我们知道把一个大象放进冰箱只需要三步!打开冰箱门,把大象放进去,关闭冰箱门。当然我们操作文件也是如此,要先打开文件。

打开文件函数:fopen

在这里插入图片描述

可见这个函数的功能就是打开一个文件,前面是文件名,后面是打开方式,注意,写入时都需要用双引号引起来,打开方式有很多种,你可以选择自己想要的方式,在我们确定好自己的打开方式后,必须创建一个文件指针(FILE*)来接收。

打开方式含义如果没有该文件->执行操作
“w”写入一个文本文件自动创建一个文件
“r”读一个文本文件返回一个空指针
“a”在文件末尾追加数据返回一个空指针
“wb”以二进制的方法写入一个文件自动创建一个文件
“rb”以二进制的方法读入一个文件返回一个空指针
“ab”以二进制的方法在文件末尾追加返回一个空指针
“r+”可读可写,操作一个文本文件返回一个空指针
“w+可读可写,建立一个新文件自动创建一个新文件
”a+“可读可写,在文件末尾进行读写自动创建一个新文件
”rb+“可读可写,操作一个二进制文件返回一个空指针
”wb+“可读可写,新建立一个二进制文件自动创建一个新文件
”ab+“可读可写,在二进制文件末尾进行读写自动创建一个新文件

这里的打开文件方式多种多样,但是聪明的你是不是发现了,只要带上w都可以自动创建一个不存在的文件,而一般带上r如果1读取错误会立马返回空指针。

我们了解了打开方式接下来就可以尝试打开文件输入数据了。

//pf就是用于接收文件目标的地址
FILE* pf=fopen("test.txt",'w');//以文本文件的方式写入一个文件

在这里插入图片描述

可以看见文件被创建了,不过要注意,我们在创建后应该判断一下再继续操作,否则创建失败,还输入数据会发生错误!!!

这里我们看见了一个关闭文件函数。

关闭文件函数:fclose

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(在这里插入图片描述

只需要将已经打开的文件指针传入文件关闭函数即可。

这里我们要介绍很多种输入输出方式,比如我们常用的scanf,printf,也是其中一种常用的输入流和输出流,这两个函数在这里就不加赘述。

函数名称函数功能作用
fgetc字符输入函数所有输出流
fputc字符输出函数所有输入流
fgets文本行(字符串)输入函数所有输出流
fputs文本行(字符串)输出函数所有输入流
fscanf格式化输入函数所有输出流
fprintf格式化输出函数所有输入流
fread从文件中读取数据文件
fwrite将数据写入文件文件

以上就是我们可以进行对文件操作的一些函数,那他们有什么区别和不同,要分外留意最后两个函数他们只针对于文件输出流和文件输入流而存在的,我们首先要明白对于输入流和输出流的打开方式是不一样的!

fgetc和fputc(字符输入输出流)

在这里插入图片描述

在这里插入图片描述

观察两个函数的参数就可以明白,fgetc是在FILE*指向的流的一个指针,可以用于判断字符结束标志,fgetc的返回值是int型,如果文件中还有字符返回int型,如果没有字符返回EOF,我们知道EOF在C语言中代表的是-1。

fputc是将字符c输出到文件stream,一次只能输入一个字符,打开创建的文件即可看到。

在这里插入图片描述

fgets和fputs(字符串输入输出流)

在这里插入图片描述

在这里插入图片描述

观察函数参数可以发现!这两个函数几乎参数一模一样,不过他们的作用可是完全不一样!

fgets函数是把文件指针指向的文件里的num个数据,以字符串的形式获取然后输入到str中。
fputs函数是将str字符串,输出到文件中。

实际应用例子:

在这里插入图片描述

这里的fgets还可以用于判断文件是否结束,文件没有结束会返回一个字符串,文件结束会返回NULL(空指针)。

在这里插入图片描述

具体代码:

//fputs
int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	char arr[10] = { 0 };
	fputs("hello world!", pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
//fgets
int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	char arr[20] = { 0 };
	fgets(arr,20, pf);
	puts(arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fprintf和fscanf(格式化输出输入流)

在这里插入图片描述

在这里插入图片描述

其实该函数与我们常用的printf和scanf只是多了一个参数,就是文件指针,我们可以利用这两个函数来用结构体做一个示例。

首先创建一个结构体

struct Stu {
	char name[20];
	int age;
	char class[10];//班级
	int score;//分数
};

函数使用时要注意文件打开方式,这里我用的都是一般打开方式,读写的方法不同,里面的内容也会有所差异。

在这里插入图片描述

在这里插入图片描述

运行代码:

//fprintf
int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	struct Stu arr = { "张三",18,"2022",81 };
	fprintf(pf, "%s %d %s %d", arr.name, arr.age, arr.class, arr.score);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}
//fscanf
int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	struct Stu arr = { 0 };
	fscanf(pf, "%s %d %s %d", arr.name, &(arr.age), arr.class, &(arr.score));
	printf("%s %d %s %d", arr.name, arr.age, arr.class, arr.score);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

这里的文件格式会影响读取格式所以要千万按照正确格式来填写。

fwrite和fread(文件输入输出流)

在这里插入图片描述

在这里插入图片描述

fwrite函数是将指针中指向的size字节大小,count个,数据写入FILE*指向的文件。

fread函数是将文件中,ize字节大小,count个数据读到ptr指针指向的区域。

一个从头到尾,一个从尾到头。

接下来看看如何使用该函数。

在这里插入图片描述

在这里插入图片描述
代码如下

//fwrite
int main()
{
		//打开文件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	struct Stu arr[10] = {{"张三",18,"2022\n",81},
						{"李四",21,"2020",92},
						{"王五",20,"2021",86}};
	fwrite(arr, sizeof(struct Stu), 3, pf);
	//此处读取3,是因为创建了3个,一般为1,利用循环来读取结构体数据,直到读完结束
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}
//fread
int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "rb");
	if (pf == NULL)
	{
		return 0;
	}
	//操作文件
	struct Stu buff[10] = { 0 };
	fread(buff, sizeof(struct Stu), 3, pf);
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%s %d %s %d\n", buff[i].name, buff[i].age, buff[i].class, buff[i].score);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

这里提到了将数据换行,在结构体中把班级和分数交换一下位置,在班级后面添加一个换行符即可。但是前者有点麻烦,一改全部要改,把数据全部改了确实有点繁琐,所以这里我们可以在打印时后面添加换行符或者在结构体中增加一个字符串,专门用于存放换行符,如果有更好的想法,欢迎提出!该文章分享就到这里,感谢观看!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:17:22 
 
开发: 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/19 5:21:52-

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