在CodeJam中,输入输出都是以文件的形式,又因为竞赛的因素,对时间要求苛刻。就需要一套简洁明了稳定的输入输出方式。

  为了方便说明,我预设两个简单的文件用来输入、输出:

  a.in

  1

  a.out会由程序自动生成,文件内容不列出。

  首先,我想到了用一个类来封装好一些基本的功能,把输入的数据读入vector或者其他什么容器中,输出的数据写成文件。由于CodeJam多种多样的输入输出结构,这个类迅速变得庞杂起来。当这个类的代码有700+行时,我不得不放弃了这个方向的尝试。还有另外一个问题,在设计思路上,这个类在读取数据和写入数据的时候,是不进行解析和计算的。CodeJam中,对算法时间复杂度的要求是很严格的,这样做无疑就浪费了很多时间。很多题目都是可以对一组数据进行读取、解析、计算、写入之后,再以此操作下一组数据的。

看了一些强人的代码之后,我发现一种方式:

#include <iostream> using namespace std; int main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); size_t T(0); cin >> T; // 此时输入自文件"a.in" // 中间处理过程省略 cout << T; // 此时输出到文件"a.out" return 0; }

  这种方式的关键,在于原来cin/cout适合屏幕绑在一起的,现在通过freopen解除了,去和文件绑在一起了。我这里是一起用的,也可能单独只绑一个cout或者cin。

  我用了几次之后,觉得这种方式很简洁灵活,非常好用。但是几天之后,忽然想起一个问题,怎么把cin/cout重新和屏幕绑起来呢?

  我查了些英文网站,结论是freopen是一个C库的函数,而C标准中没有提供能让cin/cout绑回屏幕的方式。我这才明白,为什么在实际开发中,从没见过freopen。这个有去无回的特性严重限制了freopen的应用范围。除了在这种强调算法的短小程序中,实际项目中用这玩意,就像去开一家不能放起落架的飞机。

  我希望能找到一种统一的解决方案,既能满足这种比赛,又能把同样的形式用在实际开发之中。最后,又通过一番查找后,我找到了一个C++库的解决方案,就是下面这个:

#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream inF("a.in"); streambuf* inStream_buf(cin.rdbuf()); // 中间对象保存cin的stream cin.rdbuf(inF.rdbuf()); // 将cin和文件"a.in"绑定 ofstream outF("a.out"); streambuf* outStream_buf(cout.rdbuf()); // 中间对象保存cout的stream cout.rdbuf(inF.rdbuf()); // 将cout和文件"a.out"绑定 size_t T(0); cin >> T; // 中间处理过程省略 cout << T; cin.rdbuf(inStream_buf); // 将cin帮回屏幕 cout.rdbuf(outStream_buf); // 将cout绑回屏幕 return 0; }

  C标准库不能实现而C++标准库能实现的原因是:C++把stream可以作为一个对象来保存,而C标准没有提供类似的统一方式,只是在某些平台有平台提供的方式。

适用于CodeJam的输入输出方式相关推荐

  1. (C++)字符数组的四种输入输出方式

    scanf/printf+%s getchar()/putchar() 前者不带参数后者带 gets()/puts() 二者都带参数,为一维字符数组或二维字符数组的一维 运用指针+scanf/prin ...

  2. C/C++字符数组的输入输出方式详解

    字符是C/C++读入数据最主要的类型.本篇将介绍单个字符数组/多个字符串及二维数组的输入输出方式与相关函数. 目录 单个字符串处理 ​编辑 输入 逐个元素输入 整体串形式输入 输出 逐个输出 整体串形 ...

  3. 三相llc 华为_华为电源常用的3种输入输出方式

    UPS不间断电源应用领域越来越广泛,UPS不间断电源产品也不断的更新,UPS不间断电源应用领域不同,地区不同,我们的市电输入也不同,UPS不间断电源根据不同的使用领域环境,设计出应对不同领域市电输入, ...

  4. 2.10黑盒测试-常见输入输出方式

    单点测试:一组通过就有分数,最后看分数之和. 多点测试:全部数据通过才算通过. 1.常用的输入方式:(1) while...EOF型 如果题目没有给定输入的结束条件,那么就默认读取到文件末尾.对黑盒测 ...

  5. js基础1 输入输出方式 数据类型

    1.javascript基本概念 js是一种解释型语言,可以边运行边编译,html的架构https://www.html5rocks.com/en/tutorlals/internals/howbro ...

  6. 51单片机IO口输入输出方式

    传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式:LED正极接VCC,负极接IO口.IO为高电平是LED两极电平相同,没有 ...

  7. 【汇编与接口】并行接口总结

    文章目录 并行接口的特点 并行接口电路结构形式 可编程并行接口芯片82C55A 82C55A外部特性 内部结构 82C55A的端口地址 82C55A的编程命令 82C55A的0方式及其应用 例题: 并 ...

  8. 输入输出系统1 ----- 特性 输出输出方式

    输入输出系统的特点 异步 IO系统相对于处理机是异步工作的 外设通常只要开始和结束时需要处理机干预 解决方法: 自治控制----即将处理机和外设功能剥离 实时 对于不同外设需要完成的功能不同,处理机需 ...

  9. 计算机程序中断方式有几种,奥鹏离线作业计算机组成原理一、简答题1、请说明程序查询方式与中断方式各自的特点.2、提高存储器速度可采用哪些措施,请说出...

    锅头 幼苗 共回答了17个问题采纳率:94.1% 1程序查询方式控制简单,但外设和主机不能同时工作,各外设之间也不能同时工作,系统的效率很低,因此适用于外设数目不多的.程序中断方式,无须等待查询,而是 ...

最新文章

  1. SAP PP COR3不能看工单后续的备料TO单号?
  2. python之路之面向对象3
  3. RecyclerView的基本用法
  4. ubuntu 安装docker_Docker: 教程04 - (初始化安装之在 Ubuntu 安装Docker CE)
  5. 如何做网络推广浅析在网站优化中如更换域名该如何避免降权风险?
  6. Putty、Xshell连接Linux
  7. 我有一个竞争方法,让用户去选择你的产品而不是别人
  8. Android中的消息机制
  9. 文件2. 文件重命名
  10. 从创业失败中学到的七条教训
  11. Java讲课笔记16:内部类
  12. 模板方法模式----设计模式系列
  13. python深度神经网络_深度神经网络 (第七部分)。 神经网络的融合: 堆叠
  14. 第10章 项目沟通管理
  15. 上证50基金有哪些_哪一只上证50指数基金最值得关注?
  16. Elasticsearch 快速检索的秘诀
  17. 最新PHP对接微信支付,发起商家转账API,商家转账到零钱
  18. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
  19. Functional ALV系列 (08) - Data Changed 事件
  20. 【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第四周作业(12)

热门文章

  1. Hadoop高手之路5-MapRreduce
  2. gonna,gotta,wanna的区别(参考牛津)
  3. Orace ODI 11g Cannot find a J2SE SDK installed a path
  4. 降级ServerRAID BIOS及Firmware
  5. C语言inline详细讲解
  6. MessageQueue.IdleHandler接口使用方法以及原理分析
  7. 华为手机——解锁步骤
  8. 利用坐标数据求解七参数
  9. [数据结构]图的思维导图
  10. ESP8266读取网络时间TM1637显示时间