C++:IO流

文章介绍了C语言通过scanf/printf家族函数进行输入输出,以及C++中使用iostream库,特别是cin/cout和fstream类进行标准IO和文件IO操作。C++的IO流支持包括向文件和字符串中写入及读取数据,并提到了缓冲区的概念。此外,文章还展示了如何以二进制方式处理文件读写,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

目录

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

二. C++的输入输出

2.1 C++标准IO流 

2.2 文件IO流

2.3 字符串IO流


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

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

图1.1 C语言输入输出相关函数

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

图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<fstream>

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

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

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

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

#include<iostream>
#include<fstream>
#include<string>

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既支持字符串写也支持字符串读。

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

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

#include<iostream>
#include<string>
#include<sstream>

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值