0
点赞
收藏
分享

微信扫一扫

关于格式化和流式输入输出的一些区别(scanf||cin)

莞尔小迷糊 2022-04-14 阅读 129
c++

关于格式化和流式输入输出的一些区别(scanf||cin)

笔者在最初学习C++时,着实享受了一把cin输入的爽感:不需要记忆各变量的标志,书写方式快捷简便…可知道某天在一道CodeForce的题中被疯狂飘红后,一旁的大神给我简单的换成了scanf居然直接通过了(泪目)!于是战战兢兢的又用回了scanf输入…可本着“存在即合理”的原则,cin难道没有它特别的优势吗?于是查阅各方资料,总结如下(着重探讨scanf和cin的区别,而printf和cout对应类似)

二者区别:

简单来说,cin(cout)被称之为流式输入(出),其特征为要将输入(出)的信息先存入缓冲区,再输出,导致效率降低;而scanf(printf)为格式化输入输出,从标准输入中读取字符后,进行转化输出,故效率较高;

二者的适用范围:

了解到两者的工作原理后,我们开始探讨应何时使用某种功能(优缺点):

首先对于cin,其优点是书写简单,不必区分数据类型(自动检测),缺点则是效率低(有时可以不在乎,有时就是致命的),以及在大型工程中,存入缓冲区这一步会有些意想不到的事情发生(以后见到再补充)。

而对于scanf,其优点是效率高(这就够了其实),缺点就是我们需要精准的,按格式写好语句,以及变量的标志,否则会出错(有多少新手栽在过掉一个&符号手里?)

二者其他区别:

那么除了效率和书写格式上,这两者就没有其他相关性?非也!笔者在实战中意识到,二者在处理字符串上也有不同,如下:

对cin的改进:

经查阅资料后,笔者了解到cin和stdin(标准输入,后会详解)总保持同步,即两者可混用,导致cin有大量额外开销,而若使用以下语句:

std::ios::sync_with_stdio(false);

加在前面,可取消同步,从而加快cin/cout速度(不过还是慢于scanf/printf)。

(P.S:这里这个式子似乎在学校OJ做题时会影响到样例的判别,可能是C++标准的不同所致,笔者尚且在研究其原因,若读者有所详知恳请在评论区指出,非常感谢!)

延伸:对于标准输入输出(stdin||stdout)的一点解析

(未完成,新开一篇)

后补:

倘若要将整个文件读入一个字符串,还有更强大的工具:fread

这是封装read函数(Linux系统函数)的功能,在windows系统下,效率远远高于cin||scanf,读入大量数据的文件时要学会使用。

举报

相关推荐

0 条评论