快读快写和fread,fwrite--zhengjun
首先,先谈谈快读快写
这是我一开始的输入输出
cin>>a;
cout<<a;
然后,因为在一次模拟赛中cincincin被卡掉了,于是,我就改用
scanf("%d",&a);
printf("%d",a);
可是,又有一道题,我打出了正解,可是TTT掉了一个点,结果用了快读快写,就AAA了,为什么快读会这么快,因为读入输出字符比读入输出数字快许多
不过,快读还有可能被卡,比如说一个数据,有许多多余的空格,这样你就没办法了,只好改回scanfscanfscanf。(不过我没有见过这么毒瘤的数据),当然快写也可以用递归式的,不过这样似乎会慢一点
inline void read(register int &x){x=0;register int f=1;register char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}//判断负数while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();//其中(x<<3)+(x<<1)等价于x*10,(c^48)等价于c-'0'x*=f;
}
inline void write(register int &x){ register int len=0,k1=x;if(k1<0)k1=-k1,putchar('-');while(k1)c[len++]=k1%10+'0',k1/=10;while(le--)putchar(c[len]);
}
这样,就是一个快读快写了。
当然你也可以写成有返回值的形式,不过我觉得voidvoidvoid会快一点,因为它少定义一个变量
inline int read(){register int x=0,f=1;register char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}//判断负数while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();//其中(x<<3)+(x<<1)等价于x*10,(c^48)等价于c-'0'return x*f;
}
inline void write(register int x){if(x>9)write(x/10);putchar(x%10+'0');
}
还有一点,快写是输不出000的,因为我习惯用printprintprint,所以,快写用writewritewrite,再用一个definedefinedefine
#define print(x) if(x==0)putchar('0');else write(x)
不知道为什么用三目表达式会编译错误。
然后,来说一说fread和fwrite
这个东西是个啥呢,就是文件读入输出的东西,如果不是文件读入的话freadfreadfread是不能用的,而fwritefwritefwrite是可以用的。
这个东西因为我们一次一次分开读入输出一个字符没有通过文件一次性读入输出一坨快,所以,就有了优化。
这两个东西在各种OJOJOJ上面还是适用的,因为OJOJOJ上就是文件读入输出的。
size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream );
bufferbufferbuffer是读入的数据存放的字符串,sizesizesize是每一次读入的个数,countcountcount是读入的次数,streamstreamstream是输入流
可是本来可以在freadfreadfread里面每一次多读入几次,可是如果剩余的数据不够了,就无法读入成功,而statstatstat可以求出文件的长度这样就可以了,可是windowswindowswindows似乎不行,哎!!!
freadfreadfread的返回值是
如果读入成功(一定要读完,说要读多少个少一个都不行),返回1,否则返回0
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
这个其实和freadfreadfread的参数一样。只不过我们可以在输出的时候一次全部输出玩,也就是fwrite(buffer,1,buffer的len,stream);
然后,这两个东西就可以替代getchargetchargetchar和putcharputcharputchar,会快一点。
这里要用到指针,如果不会的请先学习指针,然后再来看。
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
注意getchar()getchar()getchar()里面的
(p2=(p1=buf)+fread(buf,1,1000000,stdin)
中的加号是指针。
最终的模板
#include<bits/stdc++.h>
using namespace std;
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
template<typename item>
inline void read(register item &x){x=0;register int f=1;register char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();x*=f;
}
template<typename item>
inline void uread(register item &x){x=0;register char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
static char cc[20];
template<typename item>
inline void print(register item x){ register int len=0;if(x<0)x=-x,putchar('-');while(x)cc[len++]=x%10+'0',x/=10;while(len--)putchar(cc[len]);
}
template<typename item>
inline void uprint(register item x){ register int len=0;while(x)cc[len++]=x%10+'0',x/=10;while(len--)putchar(cc[len]);
}
int main(){fwrite(obuf,p3-obuf,1,stdout);return 0;
}
普通的输入输出:read(x),print(x)
,无符号的输入:uread()
支持同一文件中的int
和long long
的同时输入输出
例如:
int main(){int x;unsigned int ux;long long y;unsigned long long uy;read(x);uread(ux);read(y);uread(uy);print(x);putchar(' ');uprint(ux);putchar('\n');print(y);putchar(' ');uprint(uy);fwrite(obuf,p3-obuf,1,stdout);return 0;
}
输出
谢谢–zhengjun
快读快写和fread,fwrite--zhengjun相关推荐
- 快读快写:读入输出优化
引入 初学OIOIOI的时候,只用的cin/coutcin/coutcin/cout,后来教练说,cincincin很慢,有的数组光读入就超时了--balabalabalabalabalabala,所 ...
- 笔试中题目的时间复杂度以及快读快写介绍
本篇主要分享下近期笔试中, 关于时间复杂度得一些经验. 1.题目格式以及快读快写 目前比较流行的题目格式大致有两种, 一种是核心代码格式(以力扣为主), 另一种是ACM格式(NOIP为主) ...
- acm竞赛技巧——c/c++ /java 快读快写(整数,字符串)
文章目录 整数 快读 快写 字符串 读入 读出 java快读快输 注意: 本文参考博客 整数 这里用int做示范,long long,__int128 改下变量类型即可 快读 inline int r ...
- java算法竞赛必备之快读快写(超详细解读)
java算法竞赛必备之快读快写(超详细解读) java写算法的缺点:速度慢.读写复杂.莫名WA(错误答案).TL(超时).CL(超内存)- (那我们还学个啥啊,都转c++写算法不香嘛.)别急别急,有缺 ...
- 什么玩意?快读快写浮点型数据?
我下午花了一个小时写了一个什么玩意?居然能过poj1064 Cable master?大家都知道有整型数据快读快写.如下: //我写的比较骚.这么写比较简单,仅限非负整数. inline int re ...
- 【C++快读快输详解(快速读入数字,快速输出数字)】
众所周知,C++自带读入(废话),如 int a; cin>>a; 这个读入简单方便,但到后面,读的东西多了,读的也就显得慢些,所以有了下面的方式 int a; scanf("% ...
- Java的快读快输出
众所周知,Java Scanner类的读入的真的真的慢 在我们使用Scanner类进行读入数据时,数据一旦过万,他就会显得非常慢 而用StreamTokenizer类差不多好像是要比Scanner快个 ...
- C++ 快读快输模板
C++快读快输模板 [快读] inline int read() {int X=0; bool flag=1; char ch=getchar();while(ch<'0'||ch>'9' ...
- java快读快输模板
java 快读快输 快读: class InputReader {BufferedReader buf;StringTokenizer tok;InputReader() {buf = new Buf ...
最新文章
- 没有统计学基础可以学python-做统计学习应该学 Python 还是 R?
- 移动端设置点击屏幕闪烁的问题
- CSS之Multi-columns的跨列
- sr里简体中文的代码_常用的语言代码对照表
- 查询Linux的公网及内网IP
- 什么是大数据,模式识别和人工智能算法实现
- arduino(2560)与步进电机驱动器连线
- 电力拖动自动控制系统复习(四)
- 开发那点事(五)vue开发移动端app案例
- 2014 抢票工具 纯java
- 游戏策划一类的,非常好
- 通过js点击事件处理防止表单重复提交
- CCjump解决:在微信中访问app下载链接提示“已停止访问该网页”
- 【附源码】计算机毕业设计SSM校园流浪猫关爱系统
- 电脑新加内存条后 游戏崩溃 浏览器卡死 电脑蓝屏
- ibm p740做虚拟服务器,POWER740 主机板的拆除与安装图文说明
- DevOps is dirty work - CI drives you crazy
- Codeforces 513D2 Constrained Tree
- SLAM中线特征的参数化表示方法/重投影/初始化方法
- Python大牛带你实现12306全自动抢票,学完后春运回家抢票无忧
热门文章
- Android高版本使用DocumentFile读写外置存储的问题
- php如何运行vbs文件,HTML_用vbs实现在启动 Windows 资源管理器时打开特定文件夹,my-script.vbs c:\scripts 在文件夹 - phpStudy...
- Aggregation-Based Graph Convolutional Hashing forUnsupervised Cross-Modal Retrieval
- 使用vscode pull拉取报错: [rejected] (would clobber existing tag)
- 163net邮箱,对商务办公人士有哪些帮助?
- virtual box上安装ubuntu20.04遇到的问题
- 玛雅云渲染计算机设置,Maya如何使用云渲染,怎么操作?
- JNI(4) JNI Functions
- 2020浙江大学软件学院预推免经验
- linaro gcc 交叉编译链编译