C++ IO Streams 学习笔记

迫于拙劣的cpp水平,来补补以前忽略掉的cpp细节。

老规矩,先放资料。

参考资料:

A Gentle Introduction to C++ IO Streams

“Designing and implementing a general input/output facility for a
programming language is notoriously difficult”
– Bjarne Stroustrup

Stream的基本认识

说说我的理解。stream(流)可以看做输入输出的抽象。我们通过流可以忽略掉device的细节,采取同样的输入输出方式。

对于任何原生的cpp类型,都可以用stream来处理。用户自定义的类,也可以通过重载<<和>>而让stream可以处理。

 

stream大致分为inputstream和outputstream两种,分别对应的类型为std::istream和std::ostream.

stream大概有如下操作:

  •     使用适当的值类型(如stringstream的STD : : string和fstream的文件名)和适当的模式(如用于输入的IOs : : in和用于输出的IOs : : out等,具体取决于流的类型)初始化流
  • 可以通过get和put指针指定I / O应该发生的位置。根据您打开流的方式,可能已经适当地设置了位置(例如,如果使用IOs : : app打开文件,则在流的末尾设置get指针,允许附加)。

    注意:如果需要在一个stream的中间位置插入数据的话,需要手动将指针位置后面的数据移动,否则会被覆盖掉。
  • 使用<<或者>>来读或者写。

stream的错误处理

将stream当成bool来处理是比较常见的,

但是实际上有四种status:

  • good() returns true when everything is okay.
  • bad() returns true when a fatal error has occurred.
  • fail() returns true after an unsuccessful stream operation like an unexpected type of input being encountered.
  • eof() returns true when the end of file is reached.

String Streams

emm,其实string和stream好像挺像的。 区别是,string是可以随机访问的,stream是顺序访问。

输出是:

我们观察到原本句子末尾的英文句号”.”被覆盖掉了。

buffer的使用

I/O操作是相对来说比较花时间的操作,如果我们要多次写很多小文件,那会浪费大量的时间。于是我们的想法是,使用一个临时的Buffer将数据存起来,当这个buffer满了之后再去读或者写。

注意不是所有的stream都采用了这种机制,比如cerr就没有采用。

下面放一段代码来感受下buffer

 

此处flush的含义是将buffer中的内容立即输出

我们观察发现,在testBUffer中,”before loop”是在循环之后才输出的。暗示cout使用了buffer.

 

 

作者: CrazyKK

ex-ACMer@hust,stackoverflow-engineer@sensetime

说点什么

您将是第一位评论人!

提醒
wpDiscuz