fread快读

一个我也忘记我什么时候学的读入优化

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
#include <stdio.h>
#define re register

//fread直接读入文件流到内存中,速度快 ,测试后耗时为getchar() 的 5分之一 左右
inline char nc() {
static char buf[100000],*p1=buf,*p2=buf;
//static 个人理解为只作用于设定地点的变量,每次返回时数组不变
//例如:退出函数时,数组存放了1,再次进入函数,数组依然存放着1,所以这句话也可以写成全局变量
return p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
//fread(buf,1,100000,stdin) 读入100000次,长度为1,存入buf中,fread返回值为有效读取字符数
//p1=读入文件头,p2=读入文件尾,如果p1==p2,证明读完文件
//buf数组清空时才会继续读入
//可运用C++的调试查看具体过程
}

//类模板
//可随读入类型的不同,自动变化类型
//fread快读=正常的快读 把getchar改成自定义的读入
template <class T> inline void read(T &x) {
x=0;char c=nc();bool p=false;
for(; '0'>c || c>'9'; c=nc()) p|=c=='-';
for(; '0'<=c && c<='9'; c=nc()) x=(x<<1)+(x<<3)+(c^48);
x=p?-x:x;
}

int main() {
freopen("a+b.in","r",stdin);//测试时请使用freopen,提交时可去除----Luogu等在线OJ
int A,B;
read(A),read(B);
printf("%d",A+B);
}

警告 使用此方法后,慎用cin等自带的读入文件方式,用此方法读入后,文件流可能会有残留,造成读入失败

flag:“可能会把具体测试时间放上来?”