您的位置:首页 > 编程语言 > C语言/C++

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

2008-01-14 17:37 246 查看
书上关于文件流的介绍不是很清楚,且例子中有些在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的编译器之下的行为.

当然文件流还有好多更深入的操作,这里只不过对书中介绍过的提供详细的说明.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: