C/C++中的输入输出重定向


注:原创不易,转载请务必注明原作者和出处,感谢支持!

一 C/C++中的输入输出重定向

重定向在代码调试时使用有多频繁,相信经常刷算法题的同学一定深有体会。本文总结了在C和C++中进行输入输出重定向的简便方法。

1.1 C语言输入输出重定向

C语言标准库中提供了freopen()函数来进行输入输出的重定向。
函数原型:

#include <stdio.h>
FILE *freopen(const char *filename, const char *mode, FILE *stream);

功能:

  • 如果filename被指定,则函数将关闭与stream关联的文件,然后以mode模式打开文件filename并将其与stream进行关联。
  • 如果filename为空指针,则函数将stream以指定的mode更改stream的属性
  • freopen()尤其适合用来重定向预定义的文件流(stdin、stdout、stderr)

参数:

  • filename:包含文件名字符串的指针
  • mode的可能取值
    • r:读
    • w:写
    • a:追加(写)
    • r+:读写(文件必须已存在)
    • w+:读写(如果文件不存在则创建新空文件,如果已存在,则原文件内容将被丢弃!)
    • a+:追加(读写)
  • stream:文件流

返回值:如果重定向成功,则返回stream;否则,返回null

实例:

/* 将input.txt重定向到标准输入 */
freopen("input.txt", "r", stdin);

/* 将标准输出重定向到output.txt */
freopen("output.txt", "w", stdout);

1.2 C++语言输入输出重定向

C++提供了rdbuf()函数来进行重定向,与上述C语言片段功能一样的C++代码如下所示:

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char ** argv)
{
    // 备份cin和cout的默认buf
    streambuf *cin_backup, *cout_backup;
    cin_backup = cin.rdbuf();
    cout_backup = cout.rdbuf();

    // 打开要参与重定向的文件
    fstream in, out;
    in.open("in.txt", ios::in);
    out.open("out.txt", ios::out);
    if (in.fail() || out.fail())
        return -1;

    // 将in.txt内容重定向到cin
    // 将cout重定向到out.txt
    cin.rdbuf(in.rdbuf());
    cout.rdbuf(out.rdbuf());

    int n;
    cin >> n;
    cout << n << endl;

    cin.rdbuf(cin_backup);
    cout.rdbuf(cout_backup);
    return 0;
}

参考资料

  1. C++ Reference
原文地址:https://www.cnblogs.com/laizhenghong2012/p/10760253.html