为了兼容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函数的使用。的更多相关文章

  1. c++中IO输入输出流总结<二>

    1 文件的打开和关闭 1.1 定义流对象 ifsteam iflie;//文件输入流对象 ifsteam iflie;//文件输出流对象 fsteam iflie;//文件输入输出流对象 1.2 打开 ...

  2. Java中的输入输出流

    FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...

  3. c++中IO输入输出流总结<一>

    1 io类图关系 1.1 简化形式 1.1.2补充 iostream: istream:从流中读取 ostream:写入到流 iosteram:读写流 fstream: ifstream:从文件读 o ...

  4. java中基本输入输出流的解释(flush方法的使用)

    转自:http://fsz521job.itpub.net/post/5606/34827 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器 ...

  5. Perl中的输入输出流(三)

    Perl中读取标准输入:<STDIN> foreach (<STDIN>)  { print "I saw $_";} 钻石操作符<>:它的参数 ...

  6. javaSE中的输入输出流---一个读取流,相应多个输出流。并且生成的碎片文件都有有序的编号

    <span style="font-size:18px;">package com.io.other.split; import java.io.File; impor ...

  7. java中 使用输入+输出流对对象序列化

    对象: 注意记得实现 Serializable package com.nf147.sim.entity; import java.io.Serializable; public class News ...

  8. Python中倒转输入序列元素顺序的reversed函数

    reversed函数将输入的序列的元素倒转后存储到一个类型为"reversed"可迭代对象,不能直接访问,可以转换为其他对象如列表或通过for循环方法访问. 注意:这里是倒转不是倒 ...

  9. Java中的常用的输入输出流

    Java中的输入输出流根据格式又可以分为字节流和字符流:(成对) 字节流:FileInputStream,FileOutputStream   :  BufferedInputStream,Buffe ...

随机推荐

  1. Android(java)学习笔记86:案例短信发送器

    1.一般我们第一步都是先创建这个main.xml布局文件,这是良好的习惯: <?xml version="1.0" encoding="utf-8"?&g ...

  2. 不规则三角网(TIN)(转)

    来自:http://blog.csdn.net/kikitamoon/article/details/8217641 Ⅰ 数字高程模型(DEM) 地球表面高低起伏,呈现一种连续变化的曲面,这种曲面无法 ...

  3. SpriteFrameCache 精灵帧缓存

    //获取精灵帧缓存的单例对象 auto  spriteFrameCache = SpriteFrameCache::getInstance(); //从plist文件添加多个精灵帧 spriteFra ...

  4. runloop之于thread

    做一个技术方向久了,难免会沉溺其中,对当初开始接触这个方向的许多根本上的疑问渐渐都不了了之,意识上认为然,而不知其所以然. 最近重新梳理iOS的runloop,说说自己的理解,希望能说清楚. 先抛出一 ...

  5. 1.1、Mybatis一级缓存测试

    package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache ...

  6. Opencv——播放视频(带滚动条)

    #include"highgui.h" #include"cv.h" ; CvCapture* g_capture = NULL; void onTrackba ...

  7. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...

  8. CSS3滤镜!!!

    <!DOCTYPE html> <html> <head> <style> img { width: 33%; height: auto; float: ...

  9. error RC1205: invalid code page

    Get followings error and warnings when building project: error RC1205: invalid code pagewarning C400 ...

  10. java.lang.StringBuilder源码分析

    StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类.它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringB ...