快速输入输出的技巧(模板)

C++读入优化的黑科技 ### 输出优化 除了读入的黑科技以外,输出也有黑科技。 和fread对应,输出黑科技叫fwrite,就是把一整个字符串(快速地)写进输出文件。 也就是说在输出的时候,把输出的内容存进字符串,再用fwrite输出会很快(实验结果待填)

格式fwrite(buf,1,bufl,outfile) 其中size为1,表示将buf的前bufl个字符扔进输出文件outfile 当然也可以是stdout

模板(P.S:这个模板之后更新了然后因为太长被我废除了)

(不够完整)

const double eps=1e-6;
struct inout{
    static const int ibufl=1<<25;
    static const int obufl=1<<10;
    char in_buf[ibufl],out_buf[obufl],*inf,*ouf;
    void init(){
        fread(in_buf,1,ibufl,stdin);
        inf=in_buf;
        ouf=out_buf;
    }
    inout& operator >>(int &a){
        int fh=1;
        while(!(isdigit(*inf)||*inf=='-'))++inf;
        if(*inf=='-')fh=-1,++inf;
        a=0;
        while(isdigit(*inf)){a=a*10+*inf-'0';++inf;}
        a*=fh;
        return *this;
    }
    inout& operator >>(char &a){
        while(*inf==' '||*inf=='\n')++inf;
        a=*inf;
        ++inf;
        return *this;
    }
    inout& operator >>(char *a){
        while(*inf==' '||*inf=='\n')++inf;
        while(!(*inf==' '||*inf=='\n')){*a=*inf;++inf;++a;}
        *a='\0';
        return *this;
    }
    inout& operator >>(double &a){
        int fh=1;
        double s;
        while(!(isdigit(*inf)||*inf=='-'))++inf;
        if(*inf=='-')fh=-1,++inf;
        a=0;
        while(isdigit(*inf)){a=a*10+*inf-'0';++inf;}
        if(*inf=='.'){
            s=0.1;
            ++inf;
            while(isdigit(*inf)){
                a+=s*(*inf-'0');
                ++inf;
                s*=0.1;
            }
        }
        a*=fh;
        return *this;
    }
    void writeint(int x){
        if(x/10)writeint(x/10);
        *ouf=x%10+'0';
        ++ouf;
    }
    inout& operator <<(int a){
        
        if(a<0){*ouf='-';++ouf;a=-a;}
        writeint(a);
        return *this;
    }
    static const int sz=2;
    inout& operator <<(char a){
        *ouf=a;++ouf;
        return *this;
    }
    inout& operator <<(char *a){
        while(*a){
            *ouf=*a;
            ++ouf;
            ++a;
        }
        return *this;
    }
    inout& operator <<(double a){
        if(a<-eps){*ouf='-';++ouf;a=-a;}
        writeint((int)a);
        a-=(int)a;
        *ouf='.';
        ++ouf;
        up(i,1,sz){
            a=a*10;
            *ouf=(int)a+'0';
            ++ouf;
            a-=(int)a;
        }
        return *this;
    }
    void out(){
        fwrite(out_buf,1,ouf-out_buf,stdout);   
    }
};
inout io;
### 一些常量的含义: eps表示一个非常小的数用来对double进行比较。 ibufl和obufl分别表示读入文件和输出文件的大小。 size表示输出小数的位数。 当然这些都可以修改 ### 用法: 首先io.init() 读入像cin一样io>>a>>b 输出像cout一样io<<a<<b 最后io.out() ### 注意 如果输入浮点数可能出现科学计数法,千万不要直接用,要加一些修改,否则后果很惨的。 Cry