c++输出重定向 linux,C++输入输出重定向(3种方法)

2023-05-16

《C++输入流和输出流》一节提到,cout 和 cerr、clog 的一个区别是,cout 允许被重定向,而 cerr 和 clog 都不支持。值得一提的是,cin 也允许被重定向。

那么,什么是重定向呢?在默认情况下,cin 只能接收从键盘输入的数据,cout 也只能将数据输出到屏幕上。但通过重定向,cin 可以将指定文件作为输入源,即接收文件中早已准备好的数据,同样 cout 可以将原本要输出到屏幕上的数据转而写到指定文件中。

C++ 中,实现重定向的常用方式有 3 种,本节将一一做详细讲解。

C++ freopen()函数实现重定向

freopen() 定义在头文件中,是 C 语言标准库中的函数,专门用于重定向输入流(包括 scanf()、gets() 等)和输出流(包括 printf()、puts() 等)。值得一提的是,该函数也可以对 C++ 中的 cin 和 cout 进行重定向。

举个例子:

#include //cin、cout

#include //string

#include //freopen

using namespace std;

int main()

{

string name, url;

//将标准输入流重定向到 in.txt 文件

freopen("in.txt", "r", stdin);

cin >> name >> url;

//将标准输出重定向到 out.txt文件

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

cout << name << "\n" << url;

return 0;

}

执行此程序之前,我们需要找到当前程序文件所在的目录,并手动创建一个 in.txt 文件,其包含的内容如下:

C++

http://c.biancheng.net/cplus/

创建好 in.txt 文件之后,可以执行此程序,其执行结果为:

与此同时,in.txt 文件所在目录下会自动生成一个 out.txt 文件,其包含的内容和 in.txt 文件相同:

C++

http://c.biancheng.net/cplus/

显然,通过 2 次调用 freopen() 函数,分别对输入流和输出流重定向,使得 cin 不再接收由键盘输入的数据,而是直接从 in.txt 文件中获取数据;同样,cout 也不再将数据输出到屏幕上,而是写入到 out.txt 文件中。

C++ rdbuf()函数实现重定向

rdbuf() 函数定义在头文件中,专门用于实现 C++ 输入输出流的重定向。

值得一提的是,ios 作为 istream 和 ostream 类的基类,rdbuf() 函数也被继承,因此 cin 和 cout 可以直接调用该函数实现重定向。

rdbuf() 函数的语法格式有 2 种,分别为:

streambuf * rdbuf() const;

streambuf * rdbuf(streambuf * sb);

streambuf 是 C++ 标准库中用于表示缓冲区的类,该类的指针对象用于代指某个具体的流缓冲区。

其中,第一种语法格式仅是返回一个指向当前流缓冲区的指针;第二种语法格式用于将 sb 指向的缓冲区设置为当前流的新缓冲区,并返回一个指向旧缓冲区的对象。

举个例子:

#include

#include

using namespace std;

int main()

{

//打开 in.txt 文件,等待读取

ifstream fin("in.txt");

//打开 out.txt 文件,等待写入

ofstream fout("out.txt");

streambuf *oldcin;

streambuf *oldcout;

char a[100];

//用 rdbuf() 重新定向,返回旧输入流缓冲区指针

oldcin = cin.rdbuf(fin.rdbuf());

//从input.txt文件读入

cin >> a;

//用 rdbuf() 重新定向,返回旧输出流缓冲区指针

oldcout = cout.rdbuf(fout.rdbuf());

//写入 out.txt

cout << a << endl;

//还原标准输入输出流

cin.rdbuf(oldcin); // 恢复键盘输入

cout.rdbuf(oldcout); //恢复屏幕输出

//打开的文件,最终需要手动关闭

fin.close();

fout.close();

return 0;

}

程序中涉及到的文件操作,后续章节会做详细讲解,读者只需领悟 rdbuf() 函数的用法即可。

仍以前面创建好的 in.txt 文件为例,执行此程序后,控制台不会输出任何数据,而是会在该项目的目录下生成一个 out.txt 文件,其中就存有该程序的执行结果:

C++

http://c.biancheng.net/cplus/

C++通过控制台实现重定向

以上 2 种方法,都是从代码层面实现输入输出流的重定向。除此之外,我们还可以通过控制台实现输入输出的重定向。

举个例子,假设有如下代码(文件名为 demo.cpp):

#include

#include

using namespace std;

int main()

{

string name, url;

cin >> name >> url;

cout << name << '\n' << url;

return 0;

}

通过编译、链接后,会生成一个 demo.exe 可执行文件,该执行文件可以双击执行,也可以在控制台上执行。例如,打开控制台(Windows 系统下指的是 CMD命令行窗口,Linux 系统下指的是 Shell 终端),并输入如下指令:

C:\Users\mengma>D:\demo.exe

C++ http://c.biancheng.net/cplus/

C++

http://c.biancheng.net/cplus/

可以看到,demo.ext 成功被执行,但程序中的 cin 和 cout 并没有被重定向,因此这里仍需要我们手动输入测试数据。

在此基础上,继续在控制台执行如下指令:

C:\Users\mengma>D:\demo.exe out.txt

需要注意的是,执行此命令前,需保证 C:\Users\mengma 目录下有 in.txt 文件。

执行后会发现,控制台没有任何输出。这是因为,我们使用了"out.txt"对程序中的 cout 输出流做了重定向。

如果此时读者进入 C:\Users\mengma 目录就会发现,当前目录生成了一个 out.txt 文件,其中就存储了 demo.ext 的执行结果。

在控制台中使用 > 或者 < 实现重定向的方式,DOS、windows、Linux 以及 UNIX 都能自动识别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++输出重定向 linux,C++输入输出重定向(3种方法) 的相关文章

  • ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)

    文章目录 前言1 实现的功能2 建立Socket通信2 1 ABB机器人的IP地址 xff1a 2 2 SocketAccept的说明 3 服务端接发信息3 1 核心代码3 2 CurrentPos函数 4 完整代码5 实现效果 前言 本文
  • ros使用自定义消息时,编译不成功,在Cmake中报错.

    在使用自定义消息时 xff0c 按照教程添加依赖和cmakelist文件后 xff0c 保证几条Cmake语句顺序无误的情况下 xff0c 考虑msg文件夹的位置 xff0c 应在功能包的第一级目录中
  • C语言加强--韦老师公开课

    目录 1 变量与指针 摘要 xff1a 普通变量 指针变量所占的内存空间大小 xff0c 变量在内存中的分配方式 xff08 首地址要求 长度 分配长度与实际使用长度区别 需要填充字节数 全局与局部变量在内存中的位置 xff09 xff1b
  • 大小端转换(一篇文章了解所有情况下的大小端转换方法)

    总述 xff1a 字节间字节内大端低地址的数据放在高字节位域 xff1a 先从低地址对应数据字节的高bit开始分配小端低地址的数据放在低字节位域 xff1a 先从低地址对应数据字节的低bit开始分配 注释 xff1a 对于大小端的几个结论
  • C语言程序内存四区——栈区,堆区,全局区,代码区

    1 全局区 xff1a 全局区比较特殊 xff0c 里面还分成了全局变量区 xff0c 静态变量区 xff0c 常量区 全局变量区用来存放全局变量 xff0c 静态变量区用来存放带有static修饰的变量 xff08 包括静态局部变量和静态
  • Linux 用户和组

    用户和组 前言一 查看用户二 基本操作1 添加用户2 查看3 修改密码4 切换用户5 其他6 登出 前言 一个用户可以属于多个组 xff0c 并且拥有这些组的权限 一 查看用户 输入命令 cat span class token opera
  • pip 清华镜像

    pip 清华镜像 一 地址二 使用 一 地址 https pypi tuna tsinghua edu cn simple 二 使用
  • requests库将cookieJar对象转换为cookies字典

    requests库将cookieJar对象转换为cookies字典 转字典转cookieJar 使用requests获取的resposne对象 xff0c 具有cookies属性 该属性值是一个cookieJar类型 转字典 cookies
  • mybatis-generator-core插件无法下载解决办法

    mybatis generator core插件无法下载解决办法 前言一 解决办法二 插件可用 前言 maven mybatis generator core插件无法下载 一 解决办法 二 插件可用
  • idea 去绿色波浪线

    idea 去绿色波浪线 如图 如图
  • stop-writes-on-bgsave-error

    redis RDB持久化配置 RDB持久化 配置 stop writes on bgsave error 选项 如果 61 yes xff1a redis 会创建一个新的后台进程dump rdb 假设 xff1a 创建快照 xff08 硬盘
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • 四旋翼无人机硬件基础

    四旋翼无人机硬件基础 材料分析无刷电机型号转速 电子调速器作用规格四轴专用电调 xff1f 电调编程 xff1f 螺旋桨机制 规格 飞行控制器原理作用四轴 字四轴十字 电池锂电池 xff1f 电池容量电池片数放电能力插头类型T插XT60JS
  • AndroidStudio NDK开发环境配置及示例

    AndroidStudio NDK开发环境配置及示例 版本说明 版本作者日期备注0 1loon2020 8 26初稿 目录 文章目录 AndroidStudio NDK开发环境配置及示例版本说明目录一 Android Studio NDK环
  • Onvif协议学习:10、获取音视频流

    Onvif协议学习 xff1a 10 获取音视频流 文章目录 Onvif协议学习 xff1a 10 获取音视频流1 原理简介2 编码流程3 VLC播放RTSP视频4 准备FFmpeg库5 示例代码 原文链接 xff1a https blog
  • (ROS)RLException: [display_mrobot_with_camera.launch] is neither a launch file等一系列错误解决办法

    前提 xff1a 运行 roslaunch mrobot description display mrobot chassis urdf launch 有误 错误1 xff1a rviz直接打不开 错误显示 xff1a RLExceptio
  • 9款好用的SSH客户端软件推荐

    9款好用的SSH客户端软件推荐 文章目录 9款好用的SSH客户端软件推荐MobaXtermXshellTermiusPuTTYSimpleRemoteZOC TerminalFinalshellJuiceSSHServerCat SSH客户
  • 几款数据库连接工具

    几款数据库连接工具 文章目录 几款数据库连接工具1 前言2 Navicat3 DBeaver4 DataGrip5 phpMyAdmin 1 前言 我目前使用sqlite3和mysql数据库比较多 xff0c 所以对数据库客户端的需求主要是
  • win10文件资源管理器右键卡死现象解决方案大全

    win10文件资源管理器右键卡死现象解决方案大全 文章目录 win10文件资源管理器右键卡死现象解决方案大全一 右键桌面卡死 xff0c 过了许久都未反应二 右键文件夹或文件卡死2 1 方案12 2 方案22 3 方案3 xff08 靠谱
  • CLion常用插件及c文件模板配置

    CLion常用插件及c文件模板配置 文章目录 CLion常用插件及c文件模板配置1 常用插件2 模板2 1 c源文件模板 xff1a xff08 使用文件模板 xff09 2 2 c头文件模板 xff1a xff08 使用文件模板 xff0

随机推荐