C++ 流类和流对象

程序中常用的 cin 和 cout,分别用于从键盘输入数据和向屏幕输出数据(简称为标准 I/O)。除此之外,程序还可以从文件中读入数据,以及向文件中写入数据(简称为文件 I/O)。

数据输入和输出的过程也是数据传输的过程。数据像水一样从一个地方流动到另一个地方,因此,在 C++ 中将此过程称为 “流(stream)”。

在 C++ 的标准类库中,将用于进行数据输入输出的类统称为“流类”。cin 是流类 istream 的对象,cout 是流类 ostream 的对象。要使用流类,需要在程序中包含 iostream 头文件。

C++ 中常用的几个流类及其相互关系如下图所示。
在这里插入图片描述

图中的箭头代表派生关系。例如,ios 是抽象的基类,它派生出 istream 和 ostream。 istream 和 ostream 又共同派生了 iostream 类。

为了避免多继承的二义性,从 ios 派生出 istream 和 ostream 时,均使用了 virtual 关键字(虚继承)。

	istream 是用于输入的流类,cin 就是该类的对象。ostream 是用于输出的流类,cout 就是该类的对象。ifstream 是用于从文件读取数据的类。ofstream 是用于向文件写入数据的类。iostream 是既能用于输入,又能用于输出的类。fstream 是既能从文件读取数据,又能向文件写入数据的类。

标准流对象

iostream 头文件中定义了四个标准流对象,它们是 cin、cout、cerr 和 clog。

	cin 对应于标准输入流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。cout 对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。cerr 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。clog 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。

cerr 和 clog的区别:cerr 不使用缓冲区,直接向显示器输出信息;而输出到 clog 中的信息会先被存放到缓冲区,缓冲区满或者刷新时才输出到屏幕。

cout 是 ostream 类的对象。在 Visual Studio 2010 安装文件夹中有vc\crt\src\cout.cpp文件,该文件中 cout 的定义如下:

_PURE_APPDOMAIN_GLOBAL static filebuf fout(_cpp_stdout);
_PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout (&fout);

简单地看,就是:

ostream cout(&fout);

ostream 类的无参构造函数和复制构造函数都是私有的,因此在程序中一般无法定义 ostream 类的对象,唯一能用的 ostream 类的对象就是 cout。

当然,上面关于 cout 对象的定义语句说明 ostream 类是有一个公有构造函数的,如果知道这个构造函数是什么样的,那么也能自己定义 ostream 类的对象。

cout 可以被重定向,而 cerr 不能。所谓重定向,就是将输入的源或输出的目的地改变。例如,cout 本来是输出到屏幕上的,但是经过重定向,本该输出到屏幕上的东西就可以被输出到文件中。

例如下面的程序:

#include <iostream>
using namespace std;
int main()
{int x,y;cin >> x >> y;freopen("test.txt", "w", stdout);  //将标准输出重定向到 test.txt文件if( y == 0 )  //除数为0则输出错误信息cerr << "error." << endl;elsecout << x /y ;return 0;
}

第 7 行的 freopen 是一个标准库函数,第二个参数 w 代表写模式,第三个参数代表标准输出。该语句的作用是将标准输出重定向为 test.txt 文件。

重定向之后,所有对 cout 的输出都不再出现在屏幕上,而是出现在 test.txt 文件中。

test.txt 文件会和本程序的可执行文件出现在同一个文件夹中。重定向仅对本程序有效,不影响其他程序。

运行本程序,输入

6 2

程序没有输出,但是打开 test.txt文件,可以看到文件中有

3

如果输入

4 0

则程序在屏幕上输出

error.

说明 cerr 不会被重定向。

cin 也是可以被重定向的。如果在程序中加入

freopen("input.dat", "r", stdin);

第二个参数 r 代表读入方式,第三个参数 stdin 代表标准输入。执行此语句后,cin 就不再从键盘读入数据,而是从 input.dat 文件中读人数据,input.dat 文件中有什么,就相当于从键盘输入了什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言float判断相等,c/c++ 比较两个浮点数相等

首先&#xff0c;两个 if 是一样的。浮点数和整数比较时&#xff0c;整数被转为浮点数。然后&#xff0c;i 为什么不等于 10.0&#xff1f;因为它只会等于这些值&#xff1a;>>> def gen():... i 0... while i < 10:... i 0.1... yield i...>>> L list…

C++ cout格式化输出

希望按照一定的格式进行输出&#xff0c;如按十六进制输出整数&#xff0c;输出浮点数时保留小数点后面两位&#xff0c;输出整数时按 6 个数字的宽度输出&#xff0c;宽度不足时左边补 0&#xff0c;等等。C 中的 cout 对象则使用流操作算子&#xff08;你也可以叫做格式控制符…

C语言按各科分数段统计人数,(更新啦)学校学生成绩统计通用模板(科目、分数、统计分数段等均可自定,班级数、学生人数不受限制)...

更新说明&#xff1a;1、增加了导入、导出数据功能。2、该功能可以实现版本更新时不用手动复制数据&#xff0c;可实现一键导入导出。导语微信号☞gdpc-service这是一款适用于学校平时统一考试成绩统计表。这是长期根据学校的需求设计出的成绩统计&#xff0c;学生成绩清晰明了…

C++ 输出单个字符

在 C 程序中一般用 cout 和输出运算符 << 实现输出&#xff0c;cout 流在内存中有相应的缓冲区。但有时用户还有特殊的输出需求&#xff0c;例如只输出一个字符。 ostream 类除了提供上一节介绍过的用于格式控制的成员函数外&#xff0c;还提供了专门用于输出单个字符的…

ndows10同时打印多份文档,Windows10如何同时重命名多个文件

在Win10系统中整理重要文件时&#xff0c;很多用户都会对文件进行重命名&#xff0c;以便节省更多的时间。而如果文件数量非常多的话&#xff0c;我们就需要对其进行批量重命名。那么&#xff0c;这该如何操作呢&#xff1f;今天&#xff0c;小编就给大家分享一下Win10系统同时…

C++ 读取结束的判断

cin 可以用来从键盘输入数据&#xff1b;将标准输入重定向为文件后&#xff0c;cin 也可以用来从文件中读入数据。在输入数据的多少不确定&#xff0c;且没有结束标志的情况下&#xff0c;该如何判断输入数据已经读完了呢&#xff1f; 从文件中读取数据很好办&#xff0c;到达…

c语言指针算法分析怎么写,什么叫指针算法啊??

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Pointer arithmetic should not be used.This rule refers to explicitly calculating pointer values. Any such pointer value then has thepotential to access unintended or invalid memory addresses. This is an area where…

C++ 读取单个字符

get() 是 istream 类的成员函数。 int get();此函数从输入流中读入一个字符&#xff0c;返回值就是该字符的 ASCII 码。如果碰到输入的末尾&#xff0c;则返回值为 EOF。 EOF 是 End of File 的缩写。istream 类中从输入流&#xff08;包括文件&#xff09;中读取数据的成员函…

C++ 读入一行字符串

getline() 是 istream 类的成员函数&#xff0c;它有如下两个重载版本&#xff1a; istream & getline(char* buf, int bufSize); istream & getline(char* buf, int bufSize, char delim);第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf&#xff0c;或遇到\…

C语言数理逻辑题目,数学逻辑推理题整理,看看你能答对多少

年龄的秘密A、B、C三人的年龄一直是一个秘密.将A的年龄数字的位置对调一下,就是B的年龄;C的年龄段两倍是A与B两个年龄的差数;而B的年龄是C的10倍.请问&#xff1a;A、B、C三人的年龄各是多少?失误的程序员高先生是一个高级程序员&#xff0c;但是他最近设计的三款机器人却出了…

C++跳过(忽略)指定字符

ignore() 是 istream 类的成员函数&#xff0c;它的原型是&#xff1a; istream & ignore(int n 1, int delim EOF);此函数的作用是跳过输入流中的 n 个字符&#xff0c;或跳过 delim 及其之前的所有字符&#xff0c;哪个条件先满足就按哪个执行。两个参数都有默认值&…

c语言题库325,2012年二级C语言笔试模拟325

单项选择题1. 线性表L&#xff1a;(a1&#xff0c;a2&#xff0c;a3&#xff0c;…&#xff0c;ai&#xff0c;…&#xff0c;an)&#xff0c;下列说法正确的是( )。A) 每个元素都有一个直接前件和直接后件B) 线性表中至少要有一个元素C) 表中诸元素的排列顺序必须是由小到大…

C++ 查看输入流中的下一个字符

peek() 是 istream 类的成员函数&#xff0c;它的原型是&#xff1a; int peek();此函数返回输入流中的下一个字符&#xff0c;但是并不将该字符从输入流中取走相当于只是看了一眼下一个字符&#xff0c;因此叫 peek。 cin.peek() 不会跳过输入流中的空格、回车符。在输入流已…

android 自定义库,Android自定义Log库

背景我们在开发的时候肯定会打一些Log&#xff0c;特别是在调试代码或者bug的时候&#xff0c;我们都会打一些Log日志来记录&#xff0c;但是当我们发布正式版本的时候&#xff0c;尼玛&#xff0c;要一行一行的去掉&#xff0c;这就尴尬了。懵逼状态励志封装Log库本来想使用gi…

C++ 处理输入输出错误

处理输入输出时&#xff0c;我们必须预计到其中可能发生的错误并给出相应的处理措施。 当我们输入时&#xff0c;可能会由于人的失误&#xff08;错误理解了指令、打字错误等&#xff09;、文件格式不符、错误估计了情况等原因造成读取失败。当我们输出时&#xff0c;如果输出设…

android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...

1.简单介绍json是android与server通信过程中经常使用的数据格式&#xff0c;比如。例如以下是一个json格式的字符串&#xff1a;{"address":"Nanjing","name":"NUPT","students":[{"name":"stu1","…

各种语言的 Hello World

学习编程的小伙伴们可能会发现&#xff0c;不敢我们学习哪种语言&#xff0c;我们的第一个程序都是Hello World!&#xff0c;所以我们非常有必要清楚的知道Hello World!使用每一种编程语言的写法。 使用C语言实现Hello World! #includeint main(void){printf("Hello Wor…

Android拦截浏览器广告,浏览器拦截广告的几种方法

悬浮闪动的弹窗广告和牛皮癣一样铺满全屏的低质广告&#xff0c;极大地破坏了浏览网页的体验。通过启用浏览器自带的广告拦截功能&#xff0c;或为浏览器安装广告拦截插件&#xff0c;能够还原网页原本的清爽真容。浏览器自带-安卓广告拦截操作说明口碑比较好的 Via、夸克和 X浏…

C++ 深拷贝和浅拷贝

对于基本类型的数据以及简单的对象&#xff0c;它们之间的拷贝非常简单&#xff0c;就是按位复制内存。例如&#xff1a; class Base{ public:Base(): m_a(0), m_b(0){ }Base(int a, int b): m_a(a), m_b(b){ } private:int m_a;int m_b; };int main(){int a 10;int b a; /…

android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

需求现在有一个第三方库libstatic_add.a和对应的头文件static.h&#xff0c;要求封装一个Module&#xff0c;该Module依赖这个静态库&#xff0c;要求打包的Module包含该静态库。方案创建Android Studio Library Project创建Project时&#xff0c;记得添加"Include C Sup…