本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第1章,第1.8节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.8 标准流

C和C++代码精粹
C++中有4个预定义的流:cin(标准输入),cout(标准输出),cerr(标准错误),clog(标准错误)。除了cerr外其余都是全缓冲流。就像stderr一样,cerr的行为好象是非缓冲的,但事实上它是单元缓冲的,也就是说它在处理完每一个对象而不是每一个字节后会自动清除缓冲。例如,带有单元缓冲的语句:

cerr<<“hello”;
缓冲处理5个字符,然后清除缓冲区。一个非缓冲处理的流会立即发送每个字符到它的最终目的地。

程序清单1.5 通过引用从函数中返回一个对象

// retref.cpp:返回一个引用
#include <stdio.h>  int & current();  // 返回一个引用
int a[4] = {0,1,2,3};
int index = 0;  main()
{  current() = 10;  index = 3;  current() = 20;  for (int i = 0; i < 4; ++i)  printf("%d ",a[i]);  putchar('\n');
}  int & current()
{  return a[index];
}  //输出:
10 1 2 20

下列程序将标准输入拷贝到标准输出:

// copy1.cpp:将标准输入拷贝到标准输出
#include <iostream>
using namespace std;  main()
{  char c;  while (cin.get(c))  cout.put(c);
}

注意到标准头文件名(即iostream)不再使用一个.h的后缀。几乎所有C++标准库中的内容,包括流,都驻留于名字空间(namespace std)中。一个名字空间就是一个包括声明在内的已命名的范围。上面第二行using指令指示编译器在翻译期间查找声明的名字时搜寻std。标准C头文件也存在于C++程序的std标准名字空间中,并以字母c作为前缀。为了包含,可以这样做:

#include < cstdio >
using namespace std;
或用通常的#include<stdio.h>。

一个从流中读取的函数称为提取器(extractor),而一个输出函数称为插入器(inserter)。get提取器从流中把下一个字节存放到它的char引用参数中,像多数流成员函数一样,get返回流本身。当一个流出现在像上面的while循环的布尔型上下文中,如果数据成功传递,它检验为true;如果有错误,则为false。就像试图过了文件尾还要读文件一样。尽管这样简单的布尔型检验在大多数时间能满足,但你可以在任何时候使用下面这些布尔型成员函数对流的状态进行询问:

bad ( )    严重错误 (流被误用)
fail ( )   转换错误 (数据不正确但流正常)
eof ( )    文件尾
good ( )   上述都不是

下例程序实现逐行拷贝:

// copy2.cpp: 逐行拷贝
#include <iostream>
using namespace std;  main()
{  const size_t BUFSIZ = 128;  char s[BUFSIZ];  while (cin.getline(s,BUFSIZ))  cout << s << '\n';
}

getline提取器读取BUFSIZ-1个字符给s,如果遇到一个换行符就停下来,添加一个空字节,丢弃换行符。输出流使用左移运算符作为插入器。任何对象,无论是系统预定义的还是用户自定义的,都可以是流中插入链的一部分。你必须自己重载运算符<<用于自己的类中。

程序清单1.6是一个说明用>>运算符来实现提取功能的程序。由于在C中,通常使用stderr作为提示(因为它没有被缓冲),就会在C++中使用cerr:

cerr << “Please enter an integer:” ;
cin >> i;

这在C++中不是必需的,因为,cout与cin是绑定在一起的,当输出请求输入时,一个依赖于输入流的输出流被自动地刷新。如果需要强制刷新,可以使用一个flush成员函数。

程序清单1.6 回应值和地址的整型提示符

// int.cpp:为一个整数提示
#include <iostream>
using namespace std;  main()
{  int i;  cout << "请输入一个整数: ";  cin >> i;    cout << "i == " << i << '\n';  cout << "&i == " << &i << '\n';
}  //例子执行结果:
请输入一个整数:10
i == 10
&i == 0xfff4

物理地址是以定义实现的格式打印的,通常是16进制,当然字符数组是个例外,打印的是字符串的值而不是地址。要想打印C类型字符串的地址,得把它转向void * :

char s[ ] = …;
cout << ( void * ) s<< ‘\n’;   // 打印地址

操作符>>默认方式是跳过空格。程序清单1.7的程序利用这个特点来计算文本文件的字数。提取字符串操作类似于scanf中的%s格式化标志。在读取字符时,也可以关闭这种跳过空格的方式(见程序清单1.8)。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《C和C++代码精粹》——1.8 标准流相关推荐

  1. 《C和C++代码精粹》——2.5 普通指针

    本节书摘来自异步社区出版社<C和C++代码精粹>一书中的第2章,第2.5节,作者: [美]Chuck Allison,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  2. 《C和C++代码精粹》——1.7 类型安全I/O

    本节书摘来自异步社区出版社<C和C++代码精粹>一书中的第1章第1.7节,作者: [美]Chuck Allison,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  3. 从代码层面分析STM32 标准库和HAL库的差异

      如果用过STM32系列单片机的朋友会比较清楚,一般在开发STM32单片机程序的时候首先要考虑选用那种方式来写代码.常见的有三种方式,寄存器版.标准库版.HAL库版.现在选用后两种的比较多,选择寄存 ...

  4. 城市筛选数据(根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准)

    根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准,整理的城市联动筛选数据: /* 根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准 */ var cityList = [{ ...

  5. 一周技术思考(第21期)-人们说脏话的频率是衡量代码质量的唯一标准

    大家好,这里记录,我每周读到的技术书籍.专栏.文章以及遇到的工作上的技术经历的思考,不见得都对,但开始思考总是好的. Bob大叔在<代码整洁之道>这本书中,曾说过,"人们说脏话的 ...

  6. 管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】

    文章目录 代码实现 标准流 和 标准流文件描述符 代码中用到的函数 fwrite() perror() 在复习进程间的通信方式时又写了一遍,和 管道实现父子进程的信息传递(一)[fork函数.pipe ...

  7. java标准i o重定向_Java I/O(二)其他常用的输入输出流PrintStream等、标准流重定向...

    四.FilterOutputStream.PrintStream PrintStream是继承自FilterStream类的,例如标准输出流System.out就是著名的PrintStream类对象. ...

  8. html的浮动跟标准流,网页布局的 标准流 浮动流 与 定位流

    一 网页布局方式 #1.什么是网页布局方式 布局可以理解为排版,我们所熟知的文本编辑类工具都有自己的排版方式,比如word,nodpad 等等 而网页的布局方式指的就是浏览器这款工具是如何对网页中的元 ...

  9. CSS核心内容-标准流、盒子模型、浮动、定位

    CSS核心内容-标准流.盒子模型.浮动.定位,了解了核心内容才能用CSS设计出一个简单的页面 一.基础 在了解核心内容之前需要先了解HTML中的两种标签:块级元素,行内元素: 块级元素:一个块级元素占 ...

最新文章

  1. [KIWI syslog]Install document
  2. [导入]深入了解OpenOffice.org(二){作者:路广}
  3. XGBoost与LightGBM原理及应用
  4. 在Linux中搭建一个FTP服务器
  5. 三十一、Java多线程编程(下篇)
  6. PostgreSQL用户角色和权限管理
  7. WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
  8. template.js的用法
  9. cisco ios cookbook
  10. SQL Server 2012 - 数据表的操作
  11. ultraedit里面gbk编码在哪
  12. iOS12完美越狱来了!漫谈iOS12缓解机制
  13. 人脸识别算法DeepFace论文解读
  14. win10 电脑扬声器显示未插入
  15. uniapp实现图片压缩:
  16. 基于SPCE061A的语音控制小车设计
  17. python单片机自动浇花_【应用教程】Micro:bit自动浇花系统
  18. Java实例教程(上)
  19. [c#] DirectoryInfo.GetDirectories() 能扫描读取到文件夹,目录里却不存在。
  20. 9、osg3.2.1中漫游

热门文章

  1. JAVA版连连看算法研究
  2. 【转载】浅谈EDA验证工具
  3. Socket编程(C语言实现)—— Nginx支持Socket转发
  4. 数据挖掘之人工神经网络BP算法
  5. 写日历的一些总结(二)
  6. yyyyMMddHHmmss转变为日期格式
  7. html中嵌入天气预报
  8. 微信公众号接入图灵机器人实现自动回复消息
  9. LightOJ - 1098 A New Function
  10. 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).