适用于CodeJam的输入输出方式

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

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

  a.in

  1

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

 

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

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

 

 

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

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

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

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

 

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值