iostream/fstream中的输入输出流指针的绑定,tie函数的使用。
为了兼容c语言的输入输出,c++里面采用tie将输入输出流经行绑定,所以cin/cout并不是独立的。当执行cin时,cout同时会被执行。反之亦然。
by defalut,cin is tied to cout,and wcin is tied to wcout。
默认情况下,cin和cout是绑定在一起的,wcin和wcout是绑定在一起的。
也就是说默认情况下,我们执行
int a;
cin>>a;
用户输入abcd'Enter'
执行的过程是,先将abcd输入到流缓冲区中,然后从缓冲区中输出到a中。
同样
cout<<"Enter a number";
执行的过程是,先将"Enter a number."输入到缓冲区中再从缓冲区中输出到控制台上来。
由此可见,cin和cout其实并不是我们想象中的相反对立的两个函数。相反,这两个函数,其实执行的是同一个过程,都包含输入和输出。(前提是在默认情况下)
正是由于这种情况,当我们遇到数据集超大造成 cin TLE的时候,我们可能会认为这是cin的效率不及scanf的原因。其实是输入缓冲区,flush缓冲区,占用了时间。
接下来介绍一下,相关的库函数tie
看看标准库里面tie函数的定义,there's two overloads,两重重载。
<>basic_ostream<char_type,traits_type>* tie() const;
<2>basic_ostream<char_type,traits_type>* tie(basic_ostream<char_type,traits_type>* tiestr);
第一个重载:returns a pointer to the tied output stream.直接返回一个当前绑定的输出流指针。
第二个重载:ties the object to tiestr and returns a pointer to the stream tied before the call, if any.将当前对象与tiestr流指针绑定,并且返回之前绑定的流指针,如果之前没有绑定其他流指针,则返回NULL。
两个重载返回值都是一个流指针,重载<2>的形参是一个待绑定的流指针。
看下面两个例子
#01、解绑默认的绑定,加快输入输出。
比如下面
using namespace std;
void main()
{
int i;
cin.tie(&cout);
cout<<"Enter a number.";
cin>>i;
}
用户输入3'Enter'
代码执行的过程是,直接将“Enter a number."输出到控制台上,然后直接将用户输入的3读入到i中。
中间不经过缓冲区。
所以当我们要大量读取数据的时候可以tie函数解绑,来加快数据读取。
#02、指定绑定输入输出流,实现不同的输入输出功能。
// redefine tied object
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ostream *prevstr;
ofstream ofs;
ofs.open("test.txt");
cout << "tie example:\n";
*cin.tie() << "This is inserted into cout";
prevstr = cin.tie(&ofs);
*cin.tie() << "This is inserted into the file";
cin.tie(prevstr);
ofs.close();
return ;
}
将标准输入和文件输出绑定。
代码执行结果:
tie example:
This is inserted into cout
同时生成test文件
This is inserted into the file
这是因为第一个*cin.tie()等价于cout默认绑定的就是cout。
第二个*cin.tie()等价于ofs。
iostream/fstream中的输入输出流指针的绑定,tie函数的使用。的更多相关文章
- c++中IO输入输出流总结<二>
		
1 文件的打开和关闭 1.1 定义流对象 ifsteam iflie;//文件输入流对象 ifsteam iflie;//文件输出流对象 fsteam iflie;//文件输入输出流对象 1.2 打开 ...
 - Java中的输入输出流
		
FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...
 - c++中IO输入输出流总结<一>
		
1 io类图关系 1.1 简化形式 1.1.2补充 iostream: istream:从流中读取 ostream:写入到流 iosteram:读写流 fstream: ifstream:从文件读 o ...
 - java中基本输入输出流的解释(flush方法的使用)
		
转自:http://fsz521job.itpub.net/post/5606/34827 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器 ...
 - Perl中的输入输出流(三)
		
Perl中读取标准输入:<STDIN> foreach (<STDIN>) { print "I saw $_";} 钻石操作符<>:它的参数 ...
 - javaSE中的输入输出流---一个读取流,相应多个输出流。并且生成的碎片文件都有有序的编号
		
<span style="font-size:18px;">package com.io.other.split; import java.io.File; impor ...
 - java中  使用输入+输出流对对象序列化
		
对象: 注意记得实现 Serializable package com.nf147.sim.entity; import java.io.Serializable; public class News ...
 - Python中倒转输入序列元素顺序的reversed函数
		
reversed函数将输入的序列的元素倒转后存储到一个类型为"reversed"可迭代对象,不能直接访问,可以转换为其他对象如列表或通过for循环方法访问. 注意:这里是倒转不是倒 ...
 - Java中的常用的输入输出流
		
Java中的输入输出流根据格式又可以分为字节流和字符流:(成对) 字节流:FileInputStream,FileOutputStream : BufferedInputStream,Buffe ...
 
随机推荐
- 简单的ROT13码编码与解码
			
ROT13码意思是将字母左移13位.如'A' ↔ 'N', 'B' ↔ 'O','V' ↔ 'I'. 下面实现ROT13码的解码. function rot13(str) { var arr = [] ...
 - css扁平化博客学习总结(四)content代码实现
			
1.根据功能,把不同的部分写出来,方便扩展 <div class="content"><!-- 内容开始 --> <section class=&qu ...
 - PHP之文件目录基础操作
			
我们知道,临时声明的变量是保存在内存中的,即便是静态变量,在脚本运行完毕后也会被释放掉,so,想长久保存一个变量的内容,方法之一就是写到文件中,放到硬盘或服务器上,为此文件操作就必须很熟悉. 1.文件 ...
 - JAXB - XML Schema Types, Defining Types for XML Elements With Content
			
Content: A Value The content of an XML element may be some value, or one or more subordinate element ...
 - vs2010打开vs2012的sln文件
			
1.找到**.sln文件,然后选择用记事本打开. 2.最前面找到“Microsoft Visual Studio Solution File, Format Version 12.00 # Visu ...
 - 20160509-hibernate--继承映射
			
继承映射 对象模型(Java类结构) 一个类继承体系一张表(subclass)(表结构) 1.一个类继承体系一张表(subclass)(映射文件) <class name="Emplo ...
 - 异步请求---Get
			
前端 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &l ...
 - powerdesigner  使用的几点问题
			
一.powerdesigner 没有DataBase?: powerdesigner 只有在选择物理模型PDM的时候才会出现数据库菜单. 二.PowerDesigner版本控制功能? 1.首先介绍一下 ...
 - 第五篇、C_二叉搜索树
			
1.二叉树的查找功能的时间复杂度比链表的好 2.删除节点的稍微复杂点 >没有节点,直接删除 >只有左节点(或者右节点),直接用该节点的左节点(或者右节点)替代要删除的节点 >有左节点 ...
 - 隐藏NavigationBar 带来的坑
			
一.场景介绍 现在大多数APP 都有一个需求,就是隐藏某一个页面的NavigationBar.很多开发者直接 [self.navigationController setNavigationBar ...