C++基础教程示例详解:C++中的I/O重定向

在C语言中,我们可以使用函数freopen()将现有文件指针重定向到另一个流。freopen()的原型如下

FILE * freopen ( const char * filename, const char * mode, FILE * stream );

例如,要将stdout重定向为文本文件,我们可以编写

freopen ("text_file.txt", "w", stdout);

虽然在C++中仍然支持这种方法,但本文将讨论另一种重定向 I/O streams的方法。

C++作为一种面向对象的编程语言,不仅使我们能够定义自己的流,而且还可以重定向标准流。因此,在C++中,流是一个对象,其行为由类定义。因此,任何表现得像流的东西都是流。

C++中的流对象主要有三种类型:

  • istream : 此类型的流对象只能从流执行输入操作

  • ostream : 这些对象只能用于输出操作。

  • iostream : 可以同时用于输入和输出操作

顾名思义

i代表输入input

o代表输出output

stream//流

iostream//输入输出流,这只是C++的一个流文件,因为C++的输入输出都是流处理的

istream//就是只管输入的流

ostream//就是只管输出的流

(理论上应该是iostream包含了istream和ostream。但是如果只想使用ostream中的某个功能却使用了这个iostream,而iostream比较大,又包含了istream,那么这样的调用会浪费资源)

所有这些类以及文件流类都派生自以下类:ios和streambuf。因此,filestream和IO流对象的行为类似。

所有流对象还具有类streambuf的关联数据成员。简单地说,streambuf对象是流的缓冲区。从流中读取数据时,我们不会直接从源中读取数据,而是从链接到源的缓冲区中读取数据。同样,首先在缓冲区上执行输出操作,然后在需要时刷新缓冲区(将其写入物理设备)。

C++允许我们为任何流设置流缓冲区。因此,重定向流的任务只不过是更改与流相关联的流缓冲区。因此,我们需要将流A重定向到流B

  1. 获取A的流缓冲区并将其存储在某处

  2. 将A的流缓冲区设置为B的流缓冲区

  3. 如果需要,将A的流缓冲区重置为其先前的流缓冲区

我们执行重定向操作使用ios::rdbuf()方法。对于这个方法,如果不传参数,那么直接返回流对象的buffer指针。如果传递了某个流对象的buffer指针,那么将当前的流对象绑定到那个传递过来的流对象的buffer上。

我们可以使用函数 ios::rdbuf()来执行两次操作。

1) stream_object.rdbuf(): 返回流对象buffer
2) stream_object.rdbuf(streambuf * p): 绑定流对象buffer

下面是一个演示步骤的示例程序

// Cpp程序将cout重定向到文件 
#include 
#include 
#include using namespace std; int main() 
{ fstream file; file.open("cout.txt", ios::out); string line; // cout的备份流缓冲区streambuf* stream_buffer_cout = cout.rdbuf(); streambuf* stream_buffer_cin = cin.rdbuf(); // 获取文件的streambuffer streambuf* stream_buffer_file = file.rdbuf(); // 将cout重定向到文件cout.rdbuf(stream_buffer_file); cout << "Linux迷www.linuxmi.com这行写入文件" << endl; // 将cout重定向回屏幕cout.rdbuf(stream_buffer_cout); cout << "www.linuxmi.com这一行被写入屏幕" << endl; file.close(); return 0; 
}

屏幕输出:

www.linuxmi.com这一行被写入屏幕

下面这一行将写入文件
Linux迷www.linuxmi.com这行写入文件

注意:

以上步骤可以压缩为一个步骤

auto cout_buf = cout.rdbuf(file.rdbuf())

// 设置流缓冲区和返回先前的
streambuffer back to cout_buf

OK,本文就这样,有什么不对的地方请指正。

来源:https://www.linuxmi.com/io-redirection-c.html

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

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

相关文章

租房界的php,php实现出租房数据管理及搜索页面

这篇文章主要为大家详细介绍了php出租房数据管理及搜索页面的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php数据访问例子&#xff1a;租房信息管理&#xff0c;具体内容如下1.数据库建表2. zufangzi.php租房子区域&#xff1a;全选requi…

ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...

前面给大家讲过&#xff0c;函数是一种编程思想&#xff0c;是提高代码重复利用的设计思路&#xff0c;是代码设计更深层次的产物。今天要给大家讲的就是函数的核心&#xff1a;函数的参数基本概念1、函数的参数&#xff1a;是指函数完成某项功能所需要的信息。举个例子&#x…

centos7.4编译mysql5.6,centos7编译安装mysql5.6

1.useradd -s /sbin/nologin -M mysql #新增mysql运行用户2.yum -y install ncurses-devel libaio-devel cmake gcc-c #安装依赖包3.编译&#xff0c;注&#xff1a;重新cmake需要删除CMakeCache.txt文件cmake -DCMAKE_INSTALL_PREFIX/zhonghong/mysql \-DMYSQL_DATADIR/zhong…

面向对象设计思想-C语言

面向对象的三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。但是C语言不是面向对象编程语言&#xff0c;所以需要借助一些技巧来实现这三个特征&#xff1a;&#xff08;1&#xff09;C语言没有成员函数&#xff0c;struct只能封装数据&#xff0c;不能封装方法&am…

java iterable_太糟糕了,Java 8没有Iterable.stream()

java iterable这是最近比较有趣的Stack Overflow问题之一&#xff1a; 为什么Iterable不提供stream&#xff08;&#xff09;和parallelStream&#xff08;&#xff09;方法&#xff1f; 最初&#xff0c;直接将Iterable转换为Stream似乎很直观&#xff0c;因为在90&#xff…

three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型&#xff0c;大幅度提高了制作效率&#xff0c;改变WebGL开发困难的局面&#xff0c;让Web开发者享受便捷的3D开发服务。三者的难度对比如下&#xff1a;ThingJS&#xff08;框架&#xff09;< Three.js&#xff08;引擎…

C语言 | typedef

C语言typedef用新的类型名代替原有的类型名//指定用Integer为类型名&#xff0c;作用与int相同。 typedef int Integer&#xff1b;//指定用Real为类型名&#xff0c;作用与float相同。 typedef float Real&#xff1b;C语言允许程序设计者用一个简单的名字代替复杂的类型形式命…

php珠心算源码,深度解析珠心算的“开智”功能

编者按&#xff1a;本文来自李绵军校长在廊坊智慧特训营演讲。李绵军校长通过十几年来对珠心算的钻研练习&#xff0c;详细解读了珠心算的开智功能&#xff0c;以及“一门深入”的作用。珠心算的开智价值是在哪里&#xff1f;大家都说开发智力&#xff0c;我在这讲开发智力不是…

jsr 269 api_研究Java 9 Money and Currency API(JSR 354)

jsr 269 apiJSR 354定义了一个用于处理货币和货币的新Java API&#xff0c;计划将其包含在Java 9中。在本文中&#xff0c;我们将研究参考实现的当前状态&#xff1a; JavaMoney 。 就像我关于Java 8日期/时间API的帖子一样&#xff0c;该帖子将主要由显示新API的代码驱动。 …

python程序调试题_关于python程序调试问题,一个文件计算的问题

那位大神帮小弟看下这段代码有什么需要改进的没有。程序要求为&#xff1a;程序主要内容是&#xff1a;大地坐标经纬度的格式转换问题&#xff0c;例如12030′30″转换为120.50833333&#xff0c;并且可以互换&#xff0c;这样的程序。...那位大神帮小弟看下这段代码有什么需要…

C语言 函数

定义函数在 C 语言中&#xff0c;函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分&#xff1a;返回类型&#xff1a;一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值&#xff0c;在这种情况下&#xff…

cassandra 入门_Apache Cassandra和Java入门(第二部分)

cassandra 入门要求 要遵循本教程&#xff0c;您应该已经有一个正在运行的Cassandra实例&#xff08; 一个小型集群会很好 &#xff0c;但不是必需的&#xff09;&#xff0c;已安装Datastax Java驱动程序&#xff08; 请参阅第I部分 &#xff09;&#xff0c;并且已经在这里进…

蓝桥杯 java 组素数,2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数

对0,1,2,3,4,5,6,7进行全排列&#xff0c;需要注意的是0不能开头&#xff0c;所以我直接让初始值设为1,0,2,3,4,5,6,7&#xff0c;这样就避免了0开头的情况。对于每一次去判断是不是素数的话会有点浪费时间&#xff0c;所以可以用素数打表。实现代码&#xff1a;#include using…

自适应 幻灯片代码 app_字节跳动 To B 再添一员,将推出飞书文档独立App | 36氪独家...

不只是功能点的延伸&#xff0c;以 C 端打 B 端&#xff0c;是字节跳动推出“飞书文档”的另一体现。文&#xff5c;苏建勋头图来源| IC photo据36氪获悉&#xff0c;字节跳动旗下移动办公软件“飞书”将于近期推出独立 App “飞书文档”。这是继2月底&#xff0c;字节跳动推出…

听说高手都用记事本写C语言代码?

坊间传闻高手都喜欢用记事本写代码&#xff0c;那么问题来了&#xff0c;我们以C语言为例&#xff0c;如何用记事本编译运行呢&#xff1f;其实最简单的方式就是安装GCC编译器&#xff0c;在记事本编写C语言程序&#xff0c;然后再在命令行用GCC编译运行&#xff0c;下面我简单…

jface_使用JFace Viewer延迟获取模型元素

jfaceEclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载。 因此&#xff0c; 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素。 不幸的是&#xff0c;似乎仅通过DeferredTreeContentManager派生的AbstractTreeViewer支持此机制。 因此&…

php第一课,[php第一课]php简介

学习php前提&#xff1a;应有html与css知识1、php简介[1]php是一种开源通用服务器端脚本语言。[2]php&#xff1a;hypertext preprocessor&#xff0c;译名为超文本预处理器[3]在服务器上执行[4]php文件&#xff1a;{1}php文件包含文本、html、js、php代码{2}服务器上运行&…

python省略_在python中如何连接用省略号(…)分隔的连续行

您只需&#xff1a;delim ...text This is single line.This is second long line... continue from previous line.This third single line.# here were building a list containing each line# well clean up the leading and trailing whitespace# by mapping Pythons str…

C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?

一、前言昨天在编译代码的时候&#xff0c;之前一直OK的一个地方&#xff0c;却突然出现了好几个 Warning!本着强迫症要消灭一切警告的做法&#xff0c;最终定位到&#xff1a;是结构体内部&#xff0c; 指向结构体类型的指针成员变量导致的问题。这个问题&#xff0c;也许永远…

oracle 11g b表空间什么情况下自动增加,Oracle 11g表空间——创建和扩展(永久)表空间...

Oracle 11g表空间——创建和扩展(永久)表空间本文内容创建(永久)表空间查看表空间扩展表空间创建(永久)表空间Oracle 按照区和段空间进行管理表空间。区管理方式 - 针对区的分配方式的不同&#xff0c;有两种方式&#xff1a;字典管理方式(dictionary-managed tablespace&#…