fread快读 发表于 2018-10-25 一个我也忘记我什么时候学的读入优化 12345678910111213141516171819202122232425262728293031#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:“可能会把具体测试时间放上来?”