【C++】文件IO流及stringstream流的使用

一、引入

int main()
{
   
	string str;
	while (cin >> str)
	{
   
		cout << str << endl;
	}
	return 0;
}

在这里插入图片描述

我们在OJ的时候经常会用到while(cin >> str),这里的流提取实际上是个阻塞操作,只要缓冲区还有数据就继续读,默认以空格或者换行结束,有空格说明是把两段字符串尾插到str。

那么它是怎么结束呢?
答案是输入[Ctrl]-c或者[Ctrl]-z + 换行

[Ctrl]-c是发送信号结束进程。
[Ctrl]-z + 换行是通过返回值条件判断结束while循环,具体看下面讲解。

二、自定义类型隐式类型转换

cin >> str的返回值是一个istream类
在这里插入图片描述
实际上返回的就是cin对象。而c++98支持了隐式类型转换,把istream转换为bool,所以能够条件判断。

具体是怎么转换的呢?
看下面这个例子:

class A
{
   
public:
	A(int a)
		: _a(a)
	{
   }
private:
	int _a;
};

int main()
{
   
	// 内置类型转换成自定义类型
	A a = 1;
	return 0;
}

这里按道理来说是构造一个临时对象再拷贝构造,而编译器优化成了直接构造。如果没有单参数的构造函数就无法转换

那如果我们想要让自定义类型转换成内置类型呢?
直接int aa = a;肯定会报错。
但是我们可以加一个特殊的重载函数

class A
{
   
public:
	A(int a)
		: _a(a)
	{
   }

	operator int()
	{
   
		return _a;
	}
private:
	int _a;
};

int main()
{
   
	// 内置类型转换成自定义类型
	A a = 1;
	// 自定义类型转化成内置类型
	int aa = a;
	cout << aa << endl;
	return 0;
}

而我们上面说的把istream转化成bool类型就是类似这样实现的。
operator bool() 里面会检查是特殊字符([Ctrl]-z )就会返回false。

三、sync_with_stdio同步

我们知道cin和scanf都有自己的缓冲区,而如果我们用scanf写入再用cout输出,就会导致速度变慢很多(缓冲区拷贝)。

而sync_with_stdio函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。

决定C++标准streams(cin,cout,cerr…)是否与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,缺省情况是同步的,但由于同步会带来某些不必要的负担,因此该函数作用就是我们自己可以取消同步

#include <iostream>
int main() 
{
   
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // IO
}

四、文件IO流

文件的读写有两种:
1️⃣ 二进制读写
2️⃣ 文本读写

  • 49
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命由己造~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值