C++:IO流

目录

一. C语言的输入输出方式

二. C++的输入输出

2.1 C++标准IO流 

2.2 文件IO流

2.3 字符串IO流


一. C语言的输入输出方式

一般C语言通过scanf和printf来实现输入输出,scanf和printf都需要显示地指定数据类型。同时,C语言还支持fscanf/fprintf以及sscanf/sprintf,它们的功能分别为对文件写入/读取数据,和对字符串写入/读取数据。

C++:IO流_第1张图片 图1.1 C语言输入输出相关函数

为了提高读写数据的效率,将内存中的数据写入磁盘文件时,并不是拿到数据后立刻写入,而是将数据先存储在输出缓冲区中,等缓冲区满了后再集中写入到磁盘文件。从磁盘文件中读取数据同样也要有输入缓冲区作为中间媒介。

C++:IO流_第2张图片 图1.2 数据输入和输出的方式

二. C++的输入输出

2.1 C++标准IO流 

C++中使用cin作为标准输入流,cout作为标准输出流,<<为流插入操作符,>>为流提取操作符。

对于内置内类型,可以直接使用cin/cout配合<>执行输入输出,对于自定义类型数据,可以通过重载运算符实现输入和输出。

一般来说:标准输出流为屏幕,标准输入流为键盘。

2.2 文件IO流

  • C++分别定义了用于向文件中写数据和从文件中读数据的类:ofstream/ifstream
  • 还定义了既支持读数据、也支持写数据的类:iofstream

在实例化上面的类时,我们一般显示地指定其操作的文件的文件名,以及文件的打开方式,文件的打开方式定义在命名空间std::ios_base中,常用的文件打开方式有:in -- 只读、out -- 只写、binary -- 二进制的方式读/写。

支持多种方式打开文件,用|分割,如:std::ios_base::in | std::ios_base::binary表示以二进制的方式读文件内容。

使用上面三个类要包头文件:#include

图2.1 ofstream和ifstream的构造函数声明

这几个类的成员函数很多,但常用的只有下面三个:

  1. operator<<  --  向文件中写数据。
  2. operator>>  --  从文件中读取数据。
  3. get() -- 从文件中读取单个字符。

下面的代码中定义了名为ManagerStuInfo的类,其中有WriteBinary和ReadBinary函数,实现将struct student中的内容以二进制的方式写进指定文件中。先将winfo对象中的内容写入文件,然后再读取到rinfo对象中。

#include
#include
#include

struct student
{
	std::string name;
	int age;
	int stuId;
};

class ManagerStuInfo
{
public:
	ManagerStuInfo(const char* filename = "test.txt")
		: _filename(filename)
	{ }

	//二进制写文件函数
	void WriteBinary(const student& st)
	{
		std::ofstream ofs(_filename, std::ios_base::out | std::ios_base::binary);
		ofs << st.name << std::endl;
		ofs << st.age << std::endl;
		ofs << st.stuId << std::endl;
	}

	//二进制读文件函数
	void ReadBinary(student& st)
	{
		std::ifstream ifs(_filename, std::ios_base::in | std::ios_base::binary);
		ifs >> st.name;
		ifs >> st.age;
		ifs >> st.stuId;
	}

private:
	std::string _filename;
};

int main()
{
	//写文件
	student winfo = { "zhangsan", 20, 1234 };
	ManagerStuInfo msw;
	msw.WriteBinary(winfo);

	//读文件
	student rinfo;
	ManagerStuInfo msr;
	msr.ReadBinary(rinfo);

	std::cout << rinfo.name << std::endl;
	std::cout << rinfo.age << std::endl;
	std::cout << rinfo.stuId << std::endl;

	return 0;
}

2.3 字符串IO流

C++标准库中定义了ostringstream和istringstream,分别用于向字符串中写数据和从字符串中读取格式化的数据。同时还有stringstream既支持字符串写也支持字符串读。

上面三个类被定义在头文件中。

字符串IO的类与文件IO的实例化和使用方法与文件IO基本相同,str成员函数的功能是获取stringstream内部的string成员。

#include
#include
#include

struct student
{
	std::string name;
	int age;
	int stuId;
};

int main()
{
	//向字符串写数据
	student winfo = { "zhangsan", 20, 1234 };
	std::ostringstream oss;
	oss << winfo.name << " ";
	oss << winfo.age << " ";
	oss << winfo.stuId << " ";

	//从字符串中读数据
	student rinfo;
	std::string str = oss.str();
	std::istringstream iss(str);
	iss >> rinfo.name >> rinfo.age >> rinfo.stuId;

	std::cout << rinfo.name << std::endl;
	std::cout << rinfo.age << std::endl;
	std::cout << rinfo.stuId << std::endl;

	return 0;
}

你可能感兴趣的:(C++从入门到精通,c++,开发语言)