首页 > 编程语言 >对C++程序使用输入输出重定向

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

时间:2024-11-06 19:19:36浏览次数:2  
标签:std 文件 include 重定向 输入输出 C++ 缓冲区 txt

一般来说,在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*):可以使用该方法将当前流的缓冲区重定向为新的缓冲区,或者将流的输入输出目标切换到其他缓冲区。

标签:std,文件,include,重定向,输入输出,C++,缓冲区,txt
From: https://www.cnblogs.com/hisun9/p/18530887

相关文章

  • c++ 嵌入 python问题
     在嵌入式Python环境中,确保你的C++应用程序能够加载静态编译的Python解释器,需要设置Python解释器的搜索路径。以下是实现这一目标的步骤:1.设置环境变量你可以通过设置环境变量 PYTHONHOME 来指定Python解释器的根目录。这个环境变量告诉Python解释器去哪里查找......
  • C++:多态中的虚/纯虚函数,抽象类以及虚函数表
    我们在平时,旅游或者是坐高铁或火车的时候。对学生票,军人票,普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类,当然很冗余,这里我们便可以去使用继承,我们假设我们的票价是由一个票价函数控制的,如果子类与父类中有着同名的......
  • QT creator 中c和c++混编问题
    今天在编译包含.c和.cpp的QT项目,在整合各种代码的时候,碰到一些问题,为了方便后查,初步总结如下:1.新版QT中一般使用g++编译cpp文件和c文件,可以在项目中同时使用c文件和cpp文件。后缀cpp文件g++自动识别为c++代码自动进行c++编译,后缀c文件自动识别为c代码进行c编译。这个时候必须注意......
  • 南沙C++信奥赛陈老师解一本通题 1225:金银岛
    ​ 【题目描述】某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有ss个种类,每种金属重量不同,分别为n1,n2,...,nsn1,n2,...,ns,同时每个种类......
  • 鸿蒙开发进阶(HarmonyOS )FileUri开发指南(C/C++)
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)场景介......
  • C++工厂模式全解析:从简单工厂到抽象工厂的进阶之路
    在软件设计中,工厂模式(FactoryPattern)是一类创建型设计模式,用于将对象的创建过程和使用过程解耦。这种设计模式在面向对象编程中非常常见,特别是在构建复杂系统时,工厂模式可以使代码更加灵活、模块化、易于扩展。工厂模式的主要类型包括:简单工厂模式(SimpleFactory)工厂方法模......
  • C++中的各种锁p8
    在多线程开发中,经常会遇到数据同步,很多情况下用锁都是一个很好的选择。C++中常用的锁主要有下面几种:互斥锁(std::mutex)这是最基本的一种锁。它用于保护共享资源,在任意时刻,最多只有一个线程可以获取该锁,从而访问被保护的资源。当一个线程获取了互斥锁后,其他试图获取该锁的线程会......
  • 在 Windows Server 2025 中,WebDAV 重定向程序(WebDAV Redirector)是一个客户端组件,用于
    在WindowsServer2025和更高版本中,WebDAV(Web-basedDistributedAuthoringandVersioning)协议仍然可以通过启用IIS(InternetInformationServices)角色来使用。你可以安装并配置IIS中的WebDAV模块来实现文件共享和远程访问。在WindowsServer2025中,WebDAV重定向程序......
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
    文章目录前言1.auto关键字(C++11)1.1为什么要有auto关键字1.2auto关键字的使用方式1.3auto的使用细则1.4auto不能推导的场景2.基于范围的for循环(C++11)2.1范围for的语法2.2范围for的使用条件3.指针空值nullptr(C++11)3.1为什么会有nullptr这个关键字?前言本......
  • 【C/C++】野指针概念以及避免方式
    C语言中的野指针详解野指针(WildPointer)是指向未定义或非法内存位置的指针。本博客讲解野指针的概念、产生原因、危害以及如何避免野指针的问题。1.什么是野指针野指针指的是未初始化或已经失效的指针变量。这些指针指向的内存位置不再有效,可能被系统回收或被其他变量使......