ACM录 之 输入输出。

  —— 简单介绍一下ACM里面的输入输出。。。

  —— 主要说C++的输入输出(其实其他的我不会。。。)。

  —— C++里面有输入输出流,也就是cin和cout,用起来也算是比较方便吧。。。

  —— 但是,ACMer好像不怎么用这个,大都用scanf,printf这两个不是很方便的C语言遗留输入输出函数,因为。。。

  —— 大家都用的cin cout逼格太低了,是吧。。。

  —— 饿,开个玩笑,其实是因为效率的问题了,C++是兼容C语言的,为了兼容scanf和printf这些老一辈的输入输出,所以他很贴心的,让cin和cout这种输出输出流的代码里面多了一个步骤,就是检查scanf和printf的缓冲区,防止出现cin和scanf两种同时用的时候导致的混乱。。。

  —— 但是。。。如此贴心的关怀是要付出代价的,就是时间。。。之后会测试一下时间差距。。。

  —— 先来说说scanf和printf。。。

  —— 至于scanf和printf怎么用。。。谷歌或者百度吧。。。有的是详细的介绍和使用方法,把其中主要的记住就行,一些奇怪的东西不记也罢。

  然后关于ACM里面的输入输出,请看 点我点我 。看看这篇就差不多了。。。

  至于还有一些比较坑爹的输入输出要求的话就需要发挥大家的智慧了。。。

 

/////////////////////////////////////////////////////////////////////

 

  —— 当面对很多很多数据要输入或者输出的时候,两者所消耗的时间差距很大很大。。。那么下面做个实验吧。

首先先生成一个txt文件,里面有10000000个数,然后写个程序分别使用cin和scanf测试一下读入这些数的速度。(通过操作系统的管道可以直接读取文件,之后说。)

首先试试cin。

代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

int main()
{
    clock_t t=clock();

    int x;
    int N=10000000;

    for(int i=0;i<N;++i)
        cin>>x;

    cout<<clock()-t<<endl;

    return 0;
}

然后运行一下输出的是 4104488 us,也就是4秒多,就能读完这10000000个数。

然后再试试scanf:

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

int main()
{
    clock_t t=clock();

    int x;
    int N=10000000;

    for(int i=0;i<N;++i)
        scanf("%d",&x);

    cout<<clock()-t<<endl;

    return 0;
}

  输出 1201028us,也就是1秒多。。。

  饿,这我不用多说了吧,哪个快哪个慢。。。

  —— 在ACM的题目里面是有时间限制的,也就是要求程序必须在规定时间内运行完,所以说代码当然是越快越好了。。。

  —— 当然对于输出或者输出量比较小的,这两个就无所谓了,但是如果对于很多数据的输入输出。。。那么,用哪个就不多说了。。。

 

  —— 其实cin和cout是可以逆袭的,因为他们要贴心的检查缓冲区,所以才很慢,那么不让他检查不就完了。

  —— 是的,是有代码可以关掉缓冲区检查的,下面来实验一下。

代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

int main()
{
    clock_t t=clock();

    ios::sync_with_stdio(false);            /////

    int x;
    int N=10000000;

    for(int i=0;i<N;++i)
        cin>>x;

    cout<<clock()-t<<endl;

    return 0;
}

  输出的时间是 1102463 us,果然。。。逆袭成功了。。。成功了。。。

  —— 但是这里要注意一些问题,使用了上面那句代码之后,千万不要再用scanf和printf,千万不要再用scanf和printf,千万不要再用scanf和printf。

  —— 因为这时cin和cout可能会和printf他们不同步了,可能输出的顺序会混乱,这样连死都不知道是怎么死的。。。

  —— 另外就是这句话不是万能的,可能会不管用,亲身体验,血一样的教训,有一道题目不管怎么改都超时,直到。。。改成scanf,就好了。。。然后,从此再也不用那句话了,改成一定用scanf和printf了。

  —— 当然了如果不是ACM的话还是用cin和cout吧,毕竟他们年轻。。。据说更安全。。。

 

//////////////////////////////////////////////////////////////////////

 

  —— 关于文件输入输出。

  —— 那些打开文件然后读的就不说了,毕竟比较麻烦。说个省事的。。。

  —— freopen函数,重定向函数,一般ACM里面是这样用:

freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);

  —— 第一个表示用 r (read)的方式打开 in.txt 文件,然后把 stdin 重定向到 in.txt 这个文件,也就是在之前的时候 stdin(标准输入)是键盘,之后标准输入就是那个文件了,所以每次cin就不是从键盘读入了,而是从那个文件。

  —— 第二句同理。。。把标准输出重定向。。。就不输出到屏幕而是那个文件了。。。

  —— 这里注意这样干只是方便自己调试,比如输入的数据很多,一个个手打太慢了。。。提交上去之前千万记得删掉或者注释掉,因为大部分题目要求的是标准输入输出。

 

  —— 然后还有一种重定向,是关于操作系统的,ACM的判题机其实就是用的这个,机器把你提交的代码重定向到某个数据文件,然后输出也重定向到另一个文件,然后运行程序,然后运行完成的时候比较输出文件和正确的输出文件有没有不同,有的话就是不对,没有就是对了,所以写的程序每读入一组数据算出结果然后输出就行,不用一次性把所有数据读入。。。

  —— 然后具体这种怎么搞自行百度谷歌吧,其实不会也没啥,比如我。。。o(╯□╰)o

 

输入输出想的起来的差不多就这些。。。

posted @ 2015-10-05 19:30  WhyWhy。  阅读(841)  评论(0编辑  收藏  举报