对C++Primer third edition中文件流操作的补充

书上关于文件流的介绍不是很清楚,且例子中有些在vs2005中还是得不到正确结果.经过多次探索.现对文件流的操作补充如下:

   ifstream与ofstream均可以任一种模式打开,但是,若进行与本对象相违背的操作将会使流状态变为false.

  比如,ifstream以out或app 模式打开,如果进行了输出操作,则该对象的状态为false .同样,一个ofstream对象以in方式打开,却进行输入操作,即读操作,流状态也变为false.同样,fstream因为是两者派生,所以,当fstream单独以in模式打开,则认为它是等同于ifstream对象,以out或app模式打开,则认为其是ofstream对象.规则跟上边说的一样.

   ofstream用in模式打开时,是不会丢弃原文件中的数据的,只是进行覆盖的操作.而out模式的话,是先格式化了原文件,才进行写操作的,所以原有文件数据丢失.app模式是向文件尾写数据,所以用这种方式打开的话,只要是进行写操作,都会向文件尾写入数据,而无论当前位置在哪.因为app模式是不会对已有数据进行修改的.只有一个例外,就是在下边讲到的使用fstream的情况.

    前边已说,当fstream以单种模式打开时,则会认为它是对应的那种模式下的流对象,如in是ifstream,out和app是ofstream.但如果有位或将两种不同模式打开时(若相同的话,仍只是一种,同上边所述).则先使用哪种模式的操作即认为是哪种模式.例如,如果先使用了输入操作,即认为这是ifstream对象,则以后若未进行显式的位置移动,即使用seekp或seekg(两者其实是等价的,对于fstream),均认为这是一个ifstream对象.但是由于这是一个fstream,所以当进行输出操作,即写操作时,并不将字符写进去,而是丢弃了,但位置仍然移动,状态也不会变.只有当移动到文件尾时,遇到eof,状态才改变为false.如果显式移动位置,则根据移动后的操作来对这个对象定性,如果进行了写操作,即认为是ofstream对象.记住,fstream是可以进行读的,即使被认为是ofstream,所以,任何读操作均可进行,任何写操作均在文件尾进行,除非是用了out  |  in  模式,则会覆盖当前数据.否则,一律跳到文件尾写入数据.记住,写完后是不会自动回复原来的位置的.这点要注意!

    还有一点要说明,当以app模式写入时,因为认为是增加数据,所以并不认为会有结束标志,所以无论在end位置处向后偏移多少.均是认为文件尾,写入时均从文件尾写入.而不是从定义的后移了的位置.因此,并不会有文件越界.但向上会有,如果越界了,文件流对象状态将成为false.

    如果以out模式打开的话,因为并不认为是增加文件,所以向下的越界会输出乱码,但流状态不为false.只有向上越界才会成为false.

    ifstream对象的向上向下越界均会使流状态成为false.这是不难想见的.因为是读一个文件,总有上下界.但向下越界时,只有对那个位置进行了读操作才会确认是越界,即进行了操作才被设为false.而向上的越界只要一移动过了,即使不进行操作,也认为越界,状态马上变为false.

   seekg与seekp其实作用是一样的,只不过用的类型不同,ifstream只有seekg,ofstream只有seekp,当然,fstream两者均有.同样的还有tellp与tellg.它们的操作是一样的.

    记住,如果是开始位置,则tellp会输出0,而end位置会输出2,这应该是一个枚举值,注意不要混淆文件位置中的数字.也即是说,在文件中,2并不代表就是文件尾,但返回的文件尾位置必是输出2.

    以上说明全是在vs2005的编译器之下的行为.

    当然文件流还有好多更深入的操作,这里只不过对书中介绍过的提供详细的说明.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值