缓冲

C++ 的输入输出均通过缓冲区来实现。缓冲区主要是为了解决速度不匹配的问题。

cin

阻塞输入。当输入缓存中无字符时则等待用户输入。

输入缓冲

输入缓冲是一种行缓冲。在输入数据只要没有碰到换行符(回车)就将数据存入输入缓冲区,当碰到换行符之后就将缓冲区中的数据取出供变量使用,但是缓冲区中的换行符会被留在输入缓冲区中。

cin>>

  • 读取:从输入缓存中直接读取(若输入缓存无有效字符,则要求用户输入)。
  • 不读取缓存首部的无效字符(空格、回车、换行)。
  • 结束条件:空格、回车、换行。
  • 其余字符留在缓存区中。

cin.get

a=cin.get() 或 cin.get(a)

  • 读取:从输入缓存中直接读取一个字符(若输入缓存无字符,则要求用户输入)。
  • 任意字符均可,包括无效字符(空格、回车、换行)。

cin.get(arrayname,size)

  • 读取:从输入缓存中直接读取(若输入缓存无字符,则要求用户输入)。
  • 若缓存首部为空格、换行,则直接读取。
  • $\star$ 若缓存首部为换行符,则将 '\0' 赋给目标,设置失效位failbit,缓冲区被禁止读取,回车留在缓冲区。
  • 结束条件:回车、到达size-1长度(最后一个字符存结束符)。
  • $\star$ 读取结束后不会删除缓存区中的换行符。
  • $\star$ 超出size-1长度的字符留在缓冲区,供下一次读取。
  • 只能将字符串读入C风格的字符串中,即char*。

cin.get(arrayname,size,s)

s为结束符,cin.get(arrayname,size) 缺省结束符为换行符。其余用法和 cin.get(arrayname,size) 均一样。

cin.getline

无读取单个字符的形式

cin.getline(arrayname,size)

  • 读取:从输入缓存中直接读取(若输入缓存无字符,则要求用户输入)。
  • 若缓存首部为空格、换行,则直接读取。
  • $\star$ 若缓存首部为换行符,则将 '\0' 赋给目标,将换行符删除,结束此次读取。
  • 结束条件:回车、到达size-1长度(最后一个字符存结束符)。
  • $\star$ 读取结束后会删除缓存区中的换行符。
  • $\star$ 超出size-1长度,则设置失效位failbit,阻断cin流,缓冲区被禁止读取。
  • 只能将字符串读入C风格的字符串中,即char*。

cin.getline(arrayname,size,s)

s为结束符,cin.getline(arrayname,size) 缺省结束符为换行符。其余用法和 cin.getline(arrayname,size) 均一样。

getline(推荐!)

getline(cin, str)

  • cin.getline()属于istream流,只能读入char*类型中。而getline(cin, str)属于string流,可以读入string类型中。
  • cin与getline不能连用。因为cin会将 '\n' 留在缓冲区中,getline(cin, str) 遇到 '\n' 会直接返回。因此需要在cin>> 后加上cin.ignore()取出换行符。

cin.ignore

cin.ignore(size,s)

舍弃缓冲区中的长度为size或字符s之前的数据。

cin.ignore()

缺省时size=1, s=EOF(文件结束符)。常用来防止接收上次输入的回车符。

cin.ignore(std::numeric_limits< streamsize >::max(), '\n')

其中,numeric_limits::max()是头文件定义的流使用的最大值,也可以用一个足够大的整数代替。

常用来清除输入缓冲区的所有内容,使上次的输入残留下的数据不要影响到下一次的输入。不要使用cin.sync(),sync()原意是同步输入流,而不是清空缓冲区,在不同编译器里的实现可能不同,linux下g++就无法实现。

加'\n'为清除缓冲区中一行,但缓冲区中可能不止有一行。不加'\n'为清除EOF前所有的数据,但必须要确保缓冲区中有EOF符号,否则就会一直阻塞。

cin.clear

cin.clear() 将流cin中的所有状态值都重设为有效状态。

常用cin.clear() + cin.ignore(std::numeric_limits< streamsize >::max(), '\n') 清空缓冲数据。

cout

标准输出。有缓冲。

cout<<

表示输出到缓冲区,并不是直接输出到console。而是遇到endl和flush之类的才输出。

endl、flush 和 \n

  • endl: 换行+刷新输出缓冲
  • \n: 换行
  • flush: 刷新

由于输出缓冲区为行缓冲,遇到换行符自动换行。因此 endl 和 \n 在使用上没有什么区别。若在 cout 后三者都不加,则不会输出到console,直到后面程序刷新缓冲区或程序结束。

cerr

没有缓冲,发送给它的内容立即被输出。

clog

有缓冲。

【C++】输入输出的更多相关文章

  1. [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数

    水平有限,欢迎指正.原文:http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlqu ...

  2. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端

    在使用SSH终端(如Xshell)登陆时,若不慎点击 Ctrl + S  按键,会导致终端很像被锁定,输入和输出都无响应. 这是由于操作系统的终端收到指令 Ctrl + S 后,会暂停终端输入输出的刷 ...

  3. linux中输入输出和重定向问题

    输入输出解释 当我们执行shell的时候,每个进程都和三个打开的文件有关系,并使用文件描述符来引用这些文件.但这些文件不容易记忆,所以shell给了相应的文件名: 0:输入文件-标准输入(它的命令是输 ...

  4. C/C++ 标准输入输出重定向

    转载自:http://www.cnblogs.com/hjslovewcl/archive/2011/01/10/2314356.html 这个对经常在OJ上做题的童鞋们很有用.OJ基本都是用标准输入 ...

  5. Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

    在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一 ...

  6. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  7. C语言的标准输入输出

    1. 标准输入输出 标准输入.输出主要由缓冲区和操作方法两部分组.缓冲区实际上可以看做内存中的字符串数组,而操作方法主要是指printf.scanf.puts.gets,getcha.putcahr等 ...

  8. Linux标准输入输出

    linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2 以后打开文件后.新增文 ...

  9. [JAVA]HTTP请求应答作输入输出

    请求(需要发送数据给别人): URL url = new URL("需要请求的URL连接"); HttpURLConnection httpConnection = (HttpUR ...

  10. Java—输入输出技术

    在Java中,通过java.io包提供的类来表示流,基本的输入输出流为InputStream和OutputStream.从这两个基本的输入输出流派生出面向特定处理的流,如缓冲区读写流.文件读写流等. ...

随机推荐

  1. Boost的反射库PFR

    目录 目录 简介 使用方法 限制 总结 简介 Boost.PFR是一个Boost 1.75版本出的C++14的基础反射库,其使用非常简单,非常便捷,但是适用性也比较差,有很多的地方无法使用,适合比较简 ...

  2. Bristol大学密码学博士生的五十二个知识点

    Bristol大学密码学博士生的五十二个知识点 这个系列,是Bristol大学的密码安全工作组为密码学和信息安全相关的博士准备了52个基本知识点. 原地址:http://bristolcrypto.b ...

  3. WHT, SLANT, Haar

    目录 基本 酉变换 WALSH-HADAMARD TRANSFORMS sequency-ordered WHT SLANT TRANSFORM Haar Transform Gonzalez R. ...

  4. Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks

    目录 概 主要内容 算法 一些有趣的指标 鲁棒性定义 合格的抗干扰机制 Nicolas Papernot, Patrick McDaniel, Xi Wu, Somesh Jha, Ananthram ...

  5. JWT+SpringBoot实战

    往期内容:JWT - 炒焖煎糖板栗 - 博客园 (cnblogs.com) JWT可以理解为一个加密的字符串,里面由三部分组成:头部(Header).负载(Payload).签名(signature) ...

  6. CapstoneCS5265设计替代CH7211 |Type-C转HDMI2.0方案|替代CH7211

    龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...

  7. Java实习生常规技术面试题每日十题Java基础(三)

    目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...

  8. Java初学者作业——编写Java程序,实现判断所输入字符的类型(数字、小写字母、大写字母或其他字符)

    返回本章节 返回作业目录 需求说明: 编写Java程序,实现判断所输入字符的类型(数字.小写字母.大写字母或其他字符) 实现思路: 声明变量c,用于存储用户输入的字符. 通过Scanner接收用户输入 ...

  9. 使用 JavaScript 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额

    查看本章节 查看作业目录 需求说明: 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额 消费金额在 200 元以上的会员折扣是 7.5 折,消费金额没有达到 200 元的会员折扣是 ...

  10. yum 下载安装包以及依赖包

    有时候我在用yum安装软件,依赖包比较多,还受网速的影响.所以我们可以将安装包以及依赖包下载到本地安装,这样会快捷很多. yum 提供了这种功能 yum -y install yum-utils 下载 ...