对C++程序使用输入输出重定向

news/2024/12/25 13:15:36/文章来源:https://www.cnblogs.com/hisun9/p/18530887

一般来说,在Visual Studio使用文件重定向有三种方法:

方法一:通过命令行参数实现

项目→属性→配置属性→调试→命令参数

img

然后就在这里加上你的命令行参数

比如我有这样一段程序:

#include <iostream>
#include <fstream>
#include "Sales_item.h"int main()
{Sales_item trans1, trans2;int num = 1;std::cout << "若干销售记录在input.txt里,已文件重定向到输入:" << std::endl;if (std::cin >> trans1){while (std::cin >> trans2)if (compareIsbn(trans1, trans2)) // ISBN相同num++;else{//ISBN不同std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;trans1 = trans2;num = 1;}std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;}else{std::cout << "没有数据" << std::endl;return -1;}return 0;
}

传入命令行参数:

img

当运行程序时,它会自动从 input.txt 中读取输入。

输出如下:

img

插一句题外话

如果想输出重定向,可以这样:

传入类似这样的命令行参数:> output.txt

方法二:使用C的freopen_s函数重定向

这里示范下输入重定向。

比如:

#include <iostream>
#include <cstdio>
#include "Sales_item.h"int main()
{FILE* file = nullptr;errno_t err = freopen_s(&file, "input.txt", "r", stdin);if (err != 0) {std::cerr << "Failed to redirect input." << std::endl;return 1;}Sales_item trans1, trans2;int num = 1;std::cout << "若干销售记录在input.txt里,已文件重定向到输入:" << std::endl;if (std::cin >> trans1){while (std::cin >> trans2)if (compareIsbn(trans1, trans2)) // ISBN相同num++;else{//ISBN不同std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;trans1 = trans2;num = 1;}std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;}else{std::cout << "没有数据" << std::endl;return -1;}return 0;
}

输出如下:

img

其中input.txt文件内容如下:

img

插一句题外话

如果想输出重定向,可以这样:

FILE* file = nullptr;
errno_t err = freopen_s(&file, "output.txt", "w", stdout);
if (err != 0) {std::cerr << "Failed to redirect output." << std::endl;return 1;
}

补充

freopen_s 是 C 语言标准库中提供的一个更安全的版本,主要用于将标准流(如 stdinstdoutstderr)重定向到指定的文件。它是 freopen 函数的安全替代品,能够避免 freopen 函数可能带来的某些安全隐患。

freopen_s 函数原型:

errno_t freopen_s(FILE** pFile,        // 指向 FILE* 的指针,用于接收打开的文件流const char* filename, // 要打开的文件名const char* mode,     // 文件打开模式FILE* stream          // 要重定向的标准流,通常是 stdin, stdout, stderr
);

参数说明:

  • pFile

    这是一个指向 FILE* 的指针,它会接收打开的文件流指针。传递给 freopen_s 的指针会被修改为指向新打开的文件流。

    • 如果文件打开成功,*pFile 会指向该文件流。

    • 如果失败,*pFile为 nullptr。

  • filename

    需要打开的文件名或文件路径。该文件将作为输入或输出流的来源或目标。

  • mode

    文件的打开模式,类似于 fopen 中的模式参数。常见的模式包括:

    • "r":只读模式。

    • "w":写入模式(文件不存在则创建,文件存在则清空)。

    • "a":追加模式(文件存在则追加,不存在则创建)。

    • "r+":以读写模式打开文件(文件必须存在)。

    • "w+":以读写模式打开文件(如果文件存在则清空内容,不存在则创建新文件)。

    • "a+":以读写追加模式打开文件(可以读文件内容,写入数据到文件末尾)。

  • stream

    要重定向的标准流,通常为 stdin、stdout 或 stderr。

    • stdin:标准输入流。

    • stdout:标准输出流。

    • stderr:标准错误流。

  • 返回值:

    返回一个 errno_t 类型的值。

    • 如果函数成功执行,返回值为 0;

    • 如果发生错误,返回一个非零的错误代码。可以通过检查返回值来判断文件是否成功打开

方法三:使用 C++ 标准库进行输入输出流重定向

这里示范下输入重定向。

比如:

#include <iostream>
#include <fstream>
#include "Sales_item.h"int main()
{// 创建一个文件输入流对象,将其与 input.txt 文件关联std::ifstream file("input.txt");// 检查文件是否打开if (!file.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}// 将 std::cin 重定向到文件输入流std::cin.rdbuf(file.rdbuf());Sales_item trans1, trans2;int num = 1;std::cout << "若干销售记录在input.txt里,已文件重定向到输入:" << std::endl;if (std::cin >> trans1){while (std::cin >> trans2)if (compareIsbn(trans1, trans2)) // ISBN相同num++;else{//ISBN不同std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;trans1 = trans2;num = 1;}std::cout << trans1.isbn() << " 共有 "<< num << " 条销售记录" << std::endl;}else{std::cout << "没有数据" << std::endl;return -1;}return 0;
}

输出如下:

img

其中input.txt文件内容如下:

img

插一句题外话

如果想输出重定向,可以这样:

 // 创建一个文件输出流对象,将其与 output.txt 文件关联
ofstream file("output.txt");// 检查文件是否成功打开
if (!file.is_open()) {cerr << "Failed to open file." << endl;return 1;
}// 将 std::cout 重定向到文件输出流
cout.rdbuf(file.rdbuf());

补充

rdbuf 是 C++ 中流(stream)类的一个成员函数,用于访问流的缓冲区。rdbuf() 返回与流对象关联的缓冲区指针(std::streambuf*),可以通过它来操作输入输出流的缓冲区,或者将流的缓冲区重定向到其他缓冲区。

在 C++ 中,流(例如 std::cinstd::coutstd::ifstreamstd::ofstream 等)和它们的缓冲区(std::streambuf)是分开的,流本身是对输入输出的高层封装,而缓冲区则负责实际的数据读写。

rdbuf() 用法

  • rdbuf():返回当前流对象关联的缓冲区(std::streambuf*)。

  • rdbuf(streambuf*):可以使用该方法将当前流的缓冲区重定向为新的缓冲区,或者将流的输入输出目标切换到其他缓冲区。

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

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

相关文章

红米k70怎么设置「短信通知」在锁屏时隐藏内容,不锁屏时不隐藏内容

红米 K70 设置短信通知在锁屏时隐藏内容、不锁屏时不隐藏内容,可以按照以下步骤进行操作:打开手机设置:在主屏幕上找到并点击 “设置” 图标,进入手机设置页面。 进入通知与控制中心:在设置页面中,找到并点击 “通知与控制中心” 选项。 选择锁屏通知:在通知与控制中心页…

c语言中声明数组时, 元素个数必须使用常量表达式

001、[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c ## 测试程序 #include <stdio.h>int main(void) {int var1 = 5; // 初始化一个变量var1int array1[var1] = {3,5,8,4,9}; // 初始化数组return 0; } [root@PC1 test]# gcc test.c …

图的基本操作

目录1.图2.图的结构体定义3.图的初始化4.添加顶点、删除顶点4.1添加顶点4.2删除顶点5.添加边、删除边5.1添加边5.2删除边6.打印图7.main函数 在生命旅途中,我们就像是一个个节点,被无数看不见的边相连。每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 1.图 图(…

正态分布

正态分布 1 标准正态分布 1.1概率密度函数 \[f(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}} \]1.2 累计分布函数 \[F(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x}e^{-\frac{t^2}{2}}dt \] 2 (一般)正态分布 2.1 概率密度函数 \[f(x) = \frac{1}{\sqrt{2\pi\sigma…

Pycharm中使用AI辅助Coding工具Aws Toolkit

一、安装插件 二、重启完了以后点击左下角的aws 三、点developer tools,双击codewhisperer中的start,点击connect 四、点击sign out,open and copy code五、跳转到网页浏览器中打开登录界面,我们在图中所示的 code 一栏中粘贴上验证码,点击"next"按钮六、没有账…

【日志分析平台】Logstash:IT-ELK日志分析平台

以下文章来源于唯云轩 ,作者唯云轩 上篇介绍了ELK日志分析平台-Elasticsearch集群的搭建,本篇章为大家介绍Logstash的安装 服务器规划及Elasticsearch集群搭建参考上一篇:IT-ELK日志分析平台-Elasticsearch集群 Logstash安装步骤如下官网下载安装包下载地址: (https://www.e…

Next 设置字体文件cdn 或者本地

@font-face {font-family: font-ali-bold;src: url(https://cdnurl/Alibaba-PuHuiTi-Bold.woff2) format(woff2);font-weight: normal;font-style: normal; }tailwind 设置 fontFamily 直接使用变量, 直接在className上写 font-ali 即可应用该字体 本地:// const aliF…

WPF的入门学习

环境的搭配 我们通过VS的官网来安装的VS2022,安装上C#的功能,这样就完成了环境的搭配 第一个wpf工程 打开vs2022,点击如图的创建新的工程。点选WPF的项目配置一个新的项目这样就完成了项目的创建项目结构 介绍一下大概的项目结构在APP.XAml文件中,设置我们的窗体入口界面的…

【安全架构】权限控制模型

原创 大袤宏图不同的权限模型提供了灵活的访问控制策略,本文绘制了不同模型的ER图,探讨这些模型的原理及适用场景。 一、访问控制列表模型 访问控制列表模型(Access Control List, ACL) 基于资源的访问控制列表,每个资源都有一个列表记录哪些用户可以对其进行哪些操作,适用…

不用代码,2小时搞定自己的网站

之前有许多人咨询过怎么建个官网,有没有 便宜,省事,且数据由自己掌控的方式。 毕竟一个企业在初期,如果不是IT行业,不一定有程序员,但是数据由自己掌握,未来发展壮大了,人员角色被齐了,就可以在原来的基础上做更好的发展了。 最近我也把玩了一个自助建站的产品,快速试…

PentesterTools:简单的SQLMap图形化辅助工具

原创 XiaoTouMingyo Hack分享吧免责声明 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。工具介绍 SQLmap辅助工具是一款图形用户界面(GUI)工具,旨在简化和增强SQLmap的使…

【Xshell】高级用法: “隧道转发”

原创 大龙山悟道 IT运维不跑路xshell隧道转发类型 类型一:本地拨出 Local(Outgoing)作用:将本地计算机指定的某个端口连接到远程服务器的一个指定端口上。 应用场景:当从本地机器安全地访问位于远程服务器上的服务(如数据库、web服务等)时使用。 工作原理:通过SSH连接,用…