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;
}