快速输入输出的技巧(模板)
接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() ### 注意
如果输入浮点数可能出现科学计数法,千万不要直接用,要加一些修改,否则后果很惨的。
