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

C++读入优化的黑科技

输出优化

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

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

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

(不够完整)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×