C++学习笔记(十七)

本文详细介绍了C++中的文件操作,包括文本文件的读写和二进制文件的读写。通过实例代码展示了如何使用fstream库进行文件的打开、写入、读取和关闭。同时,讲解了不同文件打开模式的区别,如ios::in、ios::out、ios::ate等。
摘要由CSDN通过智能技术生成

在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第十七篇博客。

本篇博客介绍了C++的文件操作。

本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

目录

文件操作

文件操作简介

文本文件写文件

文本文件读文件

二进制文件写文件

二进制文件读文件


文件操作

文件操作简介

程序运行时产生的数据都是临时的,程序运行结束后都会释放。通过程序与文件的交互可以使数据持久化。

C++中文件操作需要包含头文件fstream

文件类型分为两种,文本文件二进制文件

文本文件以文本的ASCII码形式存储在计算机中。二进制文件以文本的二进制形式存储在计算机中,一般不能直接读懂。

操作文件分为三大类,ofstream表示写操作,ifstream表示读操作,fstream表示读写操作。

文本文件写文件

写文件需要创建一个ofstream的流对象。随后用这个对象的open函数,格式是流对象名.open("文件路径",打开方式)。

打开文件后可以写文件,格式是流对象名 << "写入的数据"

在完成所有对文件的操作后,需要关闭文件,格式是流对象名.close()

ios::in表示为读文件而打开文件。ios::out表示为写文件而打开文件。ios::ate将初始位置放在文件尾。ios::app以追加的方式写文件。ios::trunc表示如果文件存在,先删除再创建。ios::binary表示二进制形式读写。

文件打开方式可以通过利用|操作配合使用。

#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
	ofstream ofs;
	ofs.open("test.txt", ios::out);
	ofs << "Hello world" << endl;
	ofs << "Hello C++" << endl;
	ofs.close();
	return 0;
}

这段代码将Hello world和Hello C++写入test.txt文件中。程序控制台无输出。文件test.txt的内容是:

Hello world
Hello C++
 

文本文件读文件

文本文件读文件需要创建ifstream的流对象。

需要读文件时,在打开文件后通常需要判断是否打开成功,用流对象的is_open函数判断,true为成功,false为失败。

读文件最后也需要关闭文件。

读文件有四种方式。下面一一表示。

可以创建一个char类型数组,然后通过流对象 >> 数组名的方式读入。这种方式遇到空格,换行等会停止读入,可以通过while循环令其一直读入,只要不到文件末尾则一直为true。

#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
	ifstream ifs;
	ifs.open("test.txt", ios::in);

	if (!ifs.is_open()) {
		cout << "ERROR" << endl;
		return 1;
	}

	char ch[1000];
	while (ifs >> ch) {
		cout << ch << endl;
	}

	ifs.close();
	return 0;
}

这段代码创建了char类型的数组ch,并且只要不到文件末尾就一直读入,读后在循环内输出。

程序的输出是:

Hello
world
Hello
C++

文件内容就是上面写入的内容,没有修改。

也可以通过流对象的getline函数进行读文件操作。该函数有两个参数,第一个是一个char类型指针,第二个是第一个参数的大小。一次读取一行内容,并且在不到文件末尾时,结果都是true。

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main(void)
{
	ifstream ifs;
	ifs.open("test.txt", ios::in);
	if (!ifs.is_open()) {
		cout << "ERROR" << endl;
		return 1;
	}

	char ch[1000];
	while (ifs.getline(ch, sizeof(ch))) {
		cout << ch << endl;
	}
	ifs.close();
	return 0;
}

这段代码创建了一个char类型数组ch。然后进行while循环,只要不到文件末尾就一直用getline进行读入,随后在循环体中进行输出。

程序的输出是:

Hello world
Hello C++
文件内容就是上面写入的内容,没有修改。

string头文件的函数getline也可以进行读入,有两个参数,第一个是一个ifstream流对象,第二个是一个string类型对象。如果不到文件末尾则结果为true。

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main(void)
{
	ifstream ifs;
	ifs.open("test.txt", ios::in);
	if (!ifs.is_open()) {
		cout << "ERROR" << endl;
		return 1;
	}

	string str;
	while (getline(ifs, str)) {
		cout << str << endl;
	}

	ifs.close();
	return 0;
}

程序中使用while循环进行读入,在循环体内输出。

程序的结果是:

Hello world
Hello C++

文件内容就是上面写入的内容,没有修改。

ifstream流对象有一个没有参数的get函数,读取下一个字符,并将其结果返回。如果到达文件结尾,则返回EOF。EOF表示文件结尾。

#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
	ifstream ifs;
	ifs.open("test.txt", ios::in);
	if (!ifs.is_open()) {
		cout << "ERROR" << endl;
		return 1;
	}

	char ch;
	while ((ch = (ifs.get())) != EOF){
		cout << ch;
	}

	ifs.close();
	return 0;
}

程序创建了一个char类型变量ch,随后使用while循环进行不断读入,至文件末尾为止。循环体内输出ch。程序的结果是:

Hello world
Hello C++

文件内容就是上面写入的内容,没有修改。

二进制文件写文件

二进制文件读写操作都要指定ios::binary

二进制文件写文件主要用流对象调用成员函数write,write函数的原型是:

ostream& write (const char * buffer,int len)

buffer指向内存的一块空间,len是读写的字节数量。

#include<iostream>
#include<fstream>
using namespace std;
class person {
public:
	char name[20];
	int age;
};

int main(void)
{
	ofstream ofs;
	ofs.open("testbinary.txt", ios::binary | ios::out);

	person p = { "Linda",24 };
	ofs.write((const char*)&p, sizeof(p));
	ofs.close();
	return 0;
}

程序中有person类,其成员为一个char类型数组和一个int类型变量。(这里处理字符串时不要用string,因为string的一些特性会造成问题)程序创建了一个person类对象p,并将其写入文件。写的时候将地址强制类型转换成了const char类型。

程序无输出,文件中有内容(但是无法读懂)。

二进制文件读文件

二进制读文件主要调用成员函数read。函数原型是:

istream& read(char *buffer,int len)

buffer指向一块空间,len是读入的字节数。

#include<iostream>
#include<fstream>
using namespace std;
class person
{
public:
	char name[20];
	int age;
};

int main(void)
{
	ifstream ifs;
	ifs.open("testbinary.txt", ios::binary | ios::in);
	if (!ifs.is_open()) {
		cout << "ERROR" << endl;
		return 1;
	}

	person p;
	ifs.read((char*)&p, sizeof(p));
	cout << "The name is " << p.name << endl;
	cout << "The age is " << p.age << endl;

	ifs.close();
	return 0;
}

程序创建了一个person类和一个类对象。随后读入数据并进行输出。在读入时将指针强制转换为char*类型。

程序的输出是:

The name is Linda
The age is 24

类的内容和上面读入的一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值