istream和ostream

10 篇文章 0 订阅
且视他人之凝目如盏盏鬼火,大胆地去走自己的夜路。

c++的输入输出

我们在写代码的时候第一个写出来的代码是什么呢那当然是c语言的printf和c++的cout了今天的主角就是c++的cout, 那么我们在学习一个东西的时候首先要看的当然是官方的文档了,这里的话我把官方给的文档信息给大家上链接:ostreamistream
上面呢就是官方链接那么我呢先带着大家进行一个初步的认识。

c++的标准输出流ostream

首先就是ostream ,其实无论是ostrem还是istream他都是c++标准库里的一个类,而我们平常所使用的cout和cin其实也都是一个对象他的原理的是运算符重载我们重载一个<<和>>运算符就可以了,这里呢可能大家会比较好奇就是说,这里面的细节是什么呢?我给大家洗一个代码大家可以看看。

ostream& operator <<(string a, ostream& out)
{
	for (auto c : a)
	{
		out << c;
	}
	return out;
}
//这个代码其实就是模拟一下打印string a。那么如果这样子写的话最终是怎么调用的呢?
int main()
{
	string a = ("1234 1234");
	a << cout<<endl;
	return 0;
}
//如果那样子写代码的话最终的调用逻辑就是这样子的。

那么为什么会变成上面那样子呢?因为啊当我们的a作为第一个参数的时候那么我们就需要讲第一个参数a传进去所以就会变成a<<cout<<endl;但是由于这样子看着有些不习惯所以我们真正的写法是下面这个

ostream& operator <<(ostream& out,string a)
{
	for (auto c : a)
	{
		out << c;
	}
	return out;
}

解决输出的疑惑

看到这里的话相信大家还是有一些疑惑比如说上面那个重载符号为什么返回值是ostrem& 以及为什么参数那里也是引用其实大家可以试一下如果不是引用的话编译器是会报错的,这是为什么呢?因为啊ostream这个类呢系统是有一个措施就是为了防止拷贝的发生,这里的具体细节我可以接下来再给大家分享。正是因为这里的机制导致我们必须使用引用从而避免拷贝构造的发生。

c++的标准输入流istream

我们在输入的时候用到的是cin其实结合上面我所说的大家也可以推测出来那就是这个cin也是一个对象而istream是一个类,其实结合这里呢我们也可以看出来c++这门面向对象的语言与c语言的差别c语言的输入输出都是函数。而c++则是对象,那么我们可以模仿上面那个代码写一个符号重载从而写出cin。

istream& operator>>(istream& in, string& a)
{
	char ch;
	in >> ch;
  	while (ch != '\n'&&ch!=' ')
	{
		a += ch;
		in>>ch;
	}
	return in;
}

这里呢我们运行一下其实是会发现一些不理解的地方那就是这里陷入了死循环,这是咋回事呢?其实很好理解,我们可以参照一下我们使用标准库进行输入时候的场景,比较合适的例子呢其实就是我们输入一连串的整数的时候,我们在输入的时候需要用空格以及换行键进行隔开,那么说到这里相信大家有些醒悟了那就是,其实并不是因为我们没有输入进去而是因为系统拒绝接受这两个符号了很好理解因为我们更多时候是要用空格和换行进行隔开的,那么这里到底该怎么办呢?其实很好解决ostream这里呢有一个特殊的调用接口那就是get接口,我们可以调用一下就可以了代码如下。

istream& operator>>(istream& in, string& a)
{
	char ch;
	ch = in.get();
  	while (ch != '\n'&&ch!=' ')
	{
		a += ch;
		ch = in.get();
	}
	return in;
}

就像上面这个代码一样就可以做到了,其实这里呢也给我们提个醒就是假如说我们的字符串需要有空格的存在的话我们只需要改一下while循环的条件就可以了。
那么这里的话有一个问题那就是,如果我们需要输入的字符串前面有空格或者是\n怎么办呢?其实也很简单。

istream& operator>>(istream& in, string& a)
{
	char ch;
	ch = in.get();
	while(ch==' '||ch=='\n' )
	{
		ch=in.get();
	}
  	while (ch != '\n'&&ch!=' ')
	{
		a += ch;
		ch = in.get();
	}
	return in;
}

这样子的话就可以去除前面的空格以及换行符了。

总结

c++语言呢是面向对象的语言cin和cout这两个对象是更加的贴近面向对象编程的,不过呢由于缓冲区的问题导致我们再写代码 的时候我们的cin和cout的效率可能不如c语言的printf和scanf这一点呢是有办法的我们只需要禁用缓冲区就可以了。
也就是加一个这样子的代码就可以了。

ios::sync_with_stdio(0);
cin.tie(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值