缓冲

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. Rikka with Graph(hdu5631)

    Rikka with Graph  Accepts: 123  Submissions: 525  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  2. HDU 5965:扫雷(DP,递推)

    扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  3. POJ 3264:Balanced Lineup(区间最值查询ST表&线段树)

      Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 75294   Accepted: 344 ...

  4. JUC之线程间的通信

    线程通信 视频1: 2021.12.18 JUC视频学习片段 对上次多线程编程步骤补充(中部): 创建资源类,在资源类中创建属性和操作方法 在资源类里面操作 判断 干活 通知 创建多个线程,调用资源类 ...

  5. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  6. 论文翻译:2020_Joint NN-Supported Multichannel Reduction of Acoustic Echo, Reverberation and Noise

    论文地址:https://ieeexploreieee.fenshishang.com/abstract/document/9142362 神经网络支持的回声.混响和噪声联合多通道降噪 摘要 我们考虑 ...

  7. Android开发 SeekBar(拖动条)的使用

    SeekBar是Progress的子类,Progress主要用来显示进度,但是不能和用户互动,而SeekBar则可以供用户进行拖动改变进度值 实现拖动进度条并显示在文本中: <?xml vers ...

  8. Java初学者作业——编写 Java 程序,在控制台中输入日期,计算该日期是对应年份的第几天。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,在控制台中输入日期,计算该日期是对应年份的第几天. 实现思路: (1)声明变量 year.month和 date,用于存储日期中的年.月.日 ...

  9. SpringBoot 之 控制器层

    @Controller public class EmployeeController { @Autowired EmployeeDao employeeDao; @Autowired Departm ...

  10. SpringBootAdmin-使用踩坑

    一.版本选择 目前项目中使用的springcloud版本为 Hoxton.SR3,使用的spring-cloud-alibaba版本为2.2.1.RELEASE, 使用的springboot版本为2. ...