【C++】重定向是什么

1、什么是标准输入输出

C 默认:

  • printf标准输出 stdout → 默认打印到屏幕
  • scanf标准输入 stdin → 默认从键盘读取

重定向 = 改变数据流的目的地/来源

不让程序读写屏幕、键盘,改成读写文件

分为两种:

操作系统Shell重定向(外部重定向,最常用)

C代码内部重定向(freopen,程序内部实现)


2. 第一种:命令行重定向(外部,不用改代码)

编译程序得到 a.exe

bash 复制代码
# 把程序输出,从屏幕 → 写入output.txt
./a.exe > output.txt

# 从文件input.txt代替键盘输入
./a.exe < input.txt

# 输入文件,同时输出到文件
./a.exe < input.txt > output.txt

> 输出重定向

< 输入重定向

✅优点:源代码完全不用修改

3. 第二种:代码内部重定向 freopen()

头文件:#include <stdio.h>

c 复制代码
#include <stdio.h>

int main()
{
    // 输出重定向:printf不再打印屏幕,写入out.txt
    freopen("out.txt", "w", stdout);

    printf("这段文字不会出现在屏幕,保存到文件!\n");

    // 恢复回屏幕输出(可选)
    // freopen("CON", "w", stdout);
    return 0;
}

输入重定向示例:

c 复制代码
// scanf 不再读键盘,读取 in.txt
freopen("in.txt", "r", stdin);

⚠️ Windows 恢复控制台:freopen("CON","r",stdin)

Linux 恢复控制台:freopen("/dev/tty","r",stdin)


4、核心概念区分(很多人混淆)

  1. 重定向只是改变数据流方向

    程序里 printf/scanf 写法完全不用变 ,代码无需改动读写逻辑。

    程序自身"感觉"还是在和键盘、屏幕交互,底层被转发到文件。

  2. 和直接 fopen/fprintf 的区别

  • fopen:你主动创建文件指针 FILE* fp,使用 fprintf(fp, ...)
  • 重定向:不改原有printf代码,劫持全局stdin/stdout。

5、典型使用场景

  1. OJ算法刷题:本地测试,不用手动输入一堆数据;
  2. 程序日志快速导出到文件;
  3. 批量测试,自动读取测试用例。

6、常见坑

  1. freopen 失败不会报错,记得判断返回值;
  2. 程序结束前如果需要恢复控制台输出,要手动恢复;
  3. 多次freopen容易造成流泄露。

极简一句话总结

重定向:不改printf/scanf代码,把本该屏幕、键盘的数据,转移到文件中读写。

相关推荐
Lucis__15 分钟前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
YMWM_20 分钟前
查看realsense相机序列号脚本
开发语言·python·数码相机
传奇开心果编程41 分钟前
【dioxus0.7基础语法学与练】第8课:RSX 宏 — Dioxus 声明式 UI 语法
开发语言·学习·rust
Jackson_GJH1 小时前
C++虚函数、虚继承、虚基类
c++·c++基础
wuyk5551 小时前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
Evand J1 小时前
【MATLAB例程,图像降噪7】高斯加权滑动窗口滤波,用于图像降噪,带质量评价,附代码下载链接
开发语言·图像处理·matlab·滑动窗口·滤波·降噪·图像滤波
十年一梦惊觉醒1 小时前
快手视频发布助手,全自动视频发布带货工具
开发语言·前端·javascript
Java后端的Ai之路1 小时前
一文搞懂 GitHub Actions-CICD
开发语言·大模型·github·cicd·action
码匠许师傅1 小时前
【C++三方组件】开篇总论:为什么需要以及如何选型?
开发语言·c++
h_a_o777oah1 小时前
【Games101】C++ 软光追:光线追踪的求交逻辑和 BVH 提效实现及代码实现细节
c++·计算机图形学·光线追踪·games101·bvh·求交算法·软件渲染