C++程序设计:对数据文件的操作与文件流

姚老师小课堂开课啦!

一、文件的分类:

1.ASCII码文件:

ASCII文件使用方便,比较直观,便于阅读,便于对字符进行输入输出,但一般占用存储空间较多,而且需要花费转换时间(二进制形式与ASCII码之间的转换)如果是为了能显示和打印以供阅读,应当按ASCII码文件形式输出。

2.二进制文件:

二进制形式文件可以节省外存空间,而且不需要转换时间,但一个字节并不对应一个字符,不能直接显示文件中的内容,如果程序运行过程中有些中间结果数据暂时保存在磁盘文件中,以后又需要输入内存的,用二进制文件保存才是最合适的。

二、文件的打开与关闭:

1.抽象步骤

1、若想要打开一个文件,我们首先需要有一个文件可供打开,让这个文件和文件流对象建立关联,以便使文件流流向这个文件。

2、此外,我们还需要指定文件的工作方式,不同的打开方式对文件保存的结果也会造成影响,因此文件的工作方式也很重要。

2.主要步骤

主要有两种方式可供选择,以下代码和均可达到目的:

#include<iostream>
#include<fstream>//不要忘记包含头文件fstream
using namespace std;
int main() {
	int a[10];
	ofstream outfile;
	outfile.open("loveyq.dat",ios::out);//第一种打开文件的方式可将本行替换为下方注释代码
	//love_lyq.dat为文件名,ios::out是文件输入输出方式的设置值
	/*第二种打开文件的方式:
	* ofstream outfile;//定义ostream类对象outfile
	* outfile.open("loveyq.dat",ios::out);//使文件流与love_lyq.dat文件建立关联
	*/
	if (!outfile) {
		cerr << "open error" << endl;
		exit(1);
	}
	cout << "enter 10 integer numbers:" << endl;
	for (int i = 0; i < 10; i++) {
		cin >> a[i];
		outfile << a[i] << " ";
	}
	outfile.close();
	return 0;
}

3.运行程序

这时会自动生成一个名为“loveyq.dat”的文件,此时输入的数据将会保存在文件中 

4.打开文件

我们就会看到我们刚刚输入的内容,说明我们刚输入的内容已经被保存到文件中。

 附:打开文件方法:
Step1:重新打开VisualStudio

Step2:右键要打开的项目的文件夹(要打开的文件所在的项目),复制路径

Step3:点开“此电脑”,部分老式系统称之为“我的电脑”,在箭头位置粘贴路径:

 Step4:把最后一个“\”后面的所有部分去掉,这个路径是打开上一级文件夹下的.sln文件,直接回车就会直接打开程序,我们想要打开文件夹从而找到文件,因此需要把这最后一级删去,再按回车就打开文件夹啦~

继续点这个

Step5: 这个就是我们创建出来的文件啦!

附:文件输入输出方式设置值表

需要注意的是,新版本的I/O类库中不提供ios::nocreate和ios::noreplace,以这两种方式在VS2022中操作文件会报错。 

5.新设置值尝试:

当我们以ios::out或ios::in的方式操作文件时,当输入一组新的数据,这组数据会覆盖原来的数据,结果如下。

接下来让我们看一下我们把上方程序中的ios::out改成ios::app会有什么区别吧~

我们发现,新的一组数据没有覆盖原先的数据,而是接着先前的数据继续输入。这是因为当我们以ios::app的方式打开文件时写入的数据将会添加到文件的末尾,而ios::out和ios::in的打开方式将会清除之前的数据。因此,文件的打开方式也很重要。 

三、对文件的操作

前面的程序你可能还会有很多地方看不懂,那么我再在前面程序的基础上完善更多功能,让你更看不懂,逐步讲解~嘻嘻

#include<iostream>
#include<fstream>
using namespace std;
int main() {
	int a[10];
	ofstream outfile("f2.dat", ios::out);//打开磁盘文件f2.dat
	if (!outfile)//如果文件没有打开
	{
		cerr << "error!" << endl;//就会报错,cerr是标准错误流,用于输出错误信息且不进入缓冲区
		exit(1);//退出程序
	}
	cout << "enter 10 integers:" << endl;
	for (int i = 0; i < 10; i++) {
		cin >> a[i];//在控制台中输入数据
		outfile << a[i] << " ";//向磁盘文件中输出
		//也就是说,这句语句的意思就是在控制台中输入一个数据就存一个数据到文件中
		//*****这个是文件中存放数据的顺序,因为只有这句是将数据保存到文件中!!
	}
	//排序算法,为了后面输出最大值,看不懂的重修大一上程序设计和计概
	for (int i = 0; i < 10; i++) {
		for (int j = i + 1; j < 10; j++) {
			if (a[i] < a[j])
				swap(a[i], a[j]);
		}
	}
	for (int i = 0; i < 10; i++) {
		cout << a[i] << " ";//在控制台上输出排序后的数组
	}
	cout << endl;
	cout << "maximum:" << a[0];//数组最大值在排序后为数组第一位
	outfile.close();//关闭文件语句
	return 0;
}

同时,也可以改变文件的打开方式,上示示例将f2.dat作为输出文件,我们也可以将其作为输入文件,从文件中读取数组到程序中:

四、练习:

有了以上的学习积淀,请你完成下面的小练习吧!

可提供的基础代码在:继承与派生类练习plus pro pax-CSDN博客

在这段代码的基础上完成下面的要求吧!

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蜜汁博哥

我是大学生,给钱

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

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

打赏作者

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

抵扣说明:

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

余额充值