Bootstrap

C++:istream、ostream和fstream类

1、基类 istream 和 ostream

(1)istream

A.What

输入流的抽象类,是所有输入流类的基类

B.Why(输入流的作用)

用于从数据源(如文件、标准输入设备等外部设备)读取数据到内存中

(2)ostream

A.What

输出流的抽象类,是所有输出流类的基类

B.Why(输出流的作用)

输出流用于将数据从内存中写入到目标位置(外部设备),例如文件或标准输出设备(通常是屏幕)

(3)输入输出流的状态

A.Which

goodbit:表示流处于正常状态,可以进行正常的输入和输出
eofbit:表示已经到达文件末尾或流的结束位置,当文件读取完毕时,eofbit会被设置为1
failbit:表示流操作失败,如尝试将字符写入只读文件、尝试从空文件中读取数据
badbit:表示流已经崩溃或数据出现问题,如打开不存在的文件、内存不足等

stream.good();
stream.eof();
stream.fail();
stream.bad();

B.How(如何操作流状态)

获取流的状态:stream.rdstate()

if(istream.rdstate() & std::ios_base::badbit)
{ 
	std::cout<<"badbit error!"<<std::endl;
}

复位流状态位:goodbit设置为1,其它设置为0

istream.clear();

设置指定状态位为1:但 stream.setstate(goodbit)不合法

istream.setstate(std::ios_base::failbit | std::ios_base::eofbit);

2、派生类fstream

(1)fstream

A.What

C++ 标准库中用于文件输入输出操作的文件流类

B.Why

实现对文件的输入和输出操作

C.文件打开方式

模式说明
in以读的方式打开文件
out以写的方式打开文件,写数据后原文件将被覆盖
out | trunc当以 trunc 模式打开文件时,如果该文件存在, 则先清空,后写入新数据。如果文件不存在,则创建
out | app每次写操作均定位到文件末尾
binary二进制形式打开文件(in&out)
ate打开文件后立即定位到文件末尾(in&out)

(2)ifstream

A.What

文件输入流类,是istream的派生类

B.Why

用于实现从文件中读取数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以读的方式打开文件
std::ifstream inStream;
inStream.open(strFilePth);
if (!inStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
char ch[10];
while (inStream.read(ch, 10))
{
	
	std::cout << ch << std::endl;
}
inStream.close();

(3)ofstream

A.What

文件输出流类,是ostream的派生类

B.Why

用于向文件中写入数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以写的方式打开文件
std::ofstream outStream;
outStream.open("D:\\Desktop\\a.txt", std::ios_base::app);
if (!outStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
// 向文件中写入数据
int i = 0;
while (!outStream.eof())
{
	outStream << "wodeshijie" << std::endl;
	++i;
	if (i >= 10)
	{
		outStream.setstate(std::ios_base::eofbit);
		
	}
}
outStream.close();
;