转载自:http://www.cnblogs.com/hjslovewcl/archive/2011/01/10/2314356.html
这个对经常在OJ上做题的童鞋们很有用。OJ基本都是用标准输入输出(USACO除外)。但如果你在调试的时候也都是从控制台输入,那就太浪费宝贵的时间了。我们可以重定向标准输入,调试的时候从文件读,提交时从标准输入读。
在C语言中,方法比较简单。使用函数freopen():
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。
这两句代码之后,scanf函数就会从data.in文件里读,而printf函数就会输出到data.out文件里了。
C++中,对流重定向有两个重载函数:
streambuf* rdbuf () const;
streambuf* rdbuf (streambuf *)
就相当于get/set方法。
代码示例:
#include <iostream>
#include <string>
#include <fstream> using namespace std; int main(){
string str;
/*不同的string头文件不一定都支持getline(cin,string);
char a[100];
cin>>a;
cout<<a<<endl;*/
streambuf * backup;
ifstream fin;
ofstream fout;
fout.open("data.txt");
backup = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
//cin>>str; /*有空格就会停止*/
getline(cin, str); /*直到换行符处才停止*/
cout<<str<<endl;
cout.rdbuf(backup);
fout.close(); str.clear();
fin.open("data.txt");
backup = cin.rdbuf();
cin.rdbuf(fin.rdbuf()); cin>>str;
cout<<str<<'!'<<endl;
cin.rdbuf(backup); fin.close();
return ;
}
注意最后我们使用了cin.rdbuf(backup)把cin又重定向回了控制台
然而,如果用C语言实现同样的功能就不那么优雅了。
因为标准控制台设备文件的名字是与操作系统相关的。
在Dos/Windows中,名字是con
freopen("con", "r", stdin);
在Linux中,控制台设备是/dev/console
freopen("/dev/console", "r", stdin);
另外,在类unix系统中,也可以使用dup系统调用来预先复制一份原始的stdin句柄。
C/C++ 标准输入输出重定向的更多相关文章
-
【转载】标准输入输出重定向(Visual C++)
原文:标准输入输出重定向(Visual C++) 引言 本人偶得在 Visual C++ 中进行输入输出重定向的办法,比通常的做法“freopen”更加的灵活和方便,特在此共享.目前,代码正在不断地摸 ...
-
linux 标准输入输出 重定向
背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误 0 默认键盘输入 1,2默认从屏幕 ...
-
linux标准输入输出重定向
command > filename 把标准输出重定向到一个文件,如果文件不存在则新建,如果存在则覆盖其内容.command >> filename 把标准输出重定向到一个文件中,如 ...
-
linux标准输入输出与重定向
原文:http://blog.sina.com.cn/s/blog_8333cf8f0100vzzl.html##1 1. 标准输入输出和错误 linux下使用标准输入文件stdin和标准输出文 ...
-
从使用os.system)在python命令(重定向标准输入输出
从使用os.system)在python命令(重定向标准输入输出 python 标准输出stdout stdio os.system通常我可以通过改变sys.stdout的值在python更改标准输出 ...
-
linux标准输入输出及错误输出
Linux Shell 环境中支持输入输出重定向,用符号"<"和">"来表示. 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定 ...
-
Linux Shell系列教程之(十六) Shell输入输出重定向
本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...
-
全面理解Linux输入输出重定向
全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解 Linux Shell 中支持输入输出重定向,用符号&l ...
-
Linux学习笔记17——输入输出重定向
1 何谓输入输出重定向? 默认情况下输入是由键盘输入的.输出是默认的输出到屏幕上.而输入输出重定向就是改变默认的输入输出方向 2 freopen函数 freopen是被包含与stdio.h头文件中,是 ...
随机推荐
-
qt 环境下mapx组件的鼠标跟踪
经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江 ...
-
php缓存相关
在php运行期间,php引擎要对php源码进行处理,(词法分析,语法分析等)然后生成opcode. 然后再运行.在这个阶段可以把opcode缓存起来,当下次需要运行这段程序的时候,就避免了再次 进行词 ...
-
POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
-
规范 : Sql statusEnum
statusEnum 的诞生是为了在看Sql 表时,可以知道他是一个有特别的string的分类,在扩张或修改时,可以方便追踪到c#, e.g. 如果是“称呼”(column title),在sql没有 ...
-
Spring Aop 梳理
Aspect Oriented Programming 面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之 ...
-
Euclid&#39;s Game
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submission(s ...
-
Arrays 类的一些常见用法
package cn.ljs; import java.util.Arrays; public class ArrayDemo { public static void main(String [] ...
-
finecms如何控制调用子栏目的数量
finecms如何控制调用子栏目的数量?比如只要调用栏目id为23下的3个子栏目要怎么写?我们把num=3放后面不能实现,放在return前面就可以了,原来是顺序的问题,return只能放最后 {li ...
-
Shell生成数字序列
转自http://kodango.com/generate-number-sequence-in-shell Shell里怎么输出指定的数字序列: for i in {1..5}; do echo $ ...
-
es5 温故而知新 创建私有成员、私有变量、特权变量的方法
其实js是不支持私有变量的.哪怕到es6的class语法.虽然有许多变相的方式.但非常冗余而不推崇. 这里介绍的实际上也不是class语法,而是普通的函数,并且利用IIFE(闭包)的方式来实现私有. ...