最近在研究 C++ I/O 操作.. 在文件流部分卡壳了..原因是没有 真正了解到 文件打开模式组合后的各种含义
在搜索了一大堆基本没什么用处的资料后,终于找到一个比较全的组合模式了。
!!需要特别注意的是 ios:in 与ios::out 组合时,在没有说明ios::trunc 情况下 是不会请空原有记录的
原文 :http://blog.csdn.net/xxlyyhappy/article/details/6613168
本文在原文基础上 添加了一些的东西 丰富了文章内容。
打开模式:
in:打开文件时做读操作;
out:打开文件时做写操作;
app:在每次写之前找到文件尾;
ate:打开文件后立即将文件定位在文件尾;(与ios::app存在区别)
trunc:打开文件时清空已存在的文件流;
binary:以二进制模式进行IO操作;(默认时采用的是 文本文件模式)
有效组合:
并不是所有的打开模式都可以同时制定,有些模式组合是没有意义的,例如:in和trunc,准备读取文件流,但是trunc清空了文件流。
out:打开文件时做写操作,删除已经存在的数据;
out | app:打开文件时做写操作,在文件尾写入,不清空已经存在的数据;
out | trunc:打开文件时做写操作,删除已经存在的数据,与out模式相同;(之所以相同 是因为默认的构造函数就是用 ios::out|ios|trunc)
in:打开文件时做读操作;
in | out打开文件时做读写操作,并定位于文件的开头处,不清空已经存在的数据;
in | out | trunc:打开文件时做读写操作,删除文件中已经有的数据;
当文件同时以in out模式打开时,不会清空已有数据;
如果只使用了out,而没有指定in模式,则会清空已有数据;
如果使用了trunc,不论是否使用了in,都会清空已有的数据(前提是有ios::out);
ifstream 对象 提供默认 文件模式 ios::in;
ofstream 对象提供默认 文件模式 ios::out|ios::trunc;
fstream 对象不提供默认的 文件模式 因此只能自己敲了;
另外对于二进制文件I/O操作。还涉及到一个概念 随机存取, 它相对于 文本文件的顺序存取而言
所谓顺序存取 即 按其在文件中的逻辑顺序依次存取的,只能从头往下读;有点类似堆栈的概念;
而随机存取则 另辟蹊径 使得可以直接在流中的任意位置移动;
随机存取涉及的函数有以下四个:
seekg(...省略参数) (g 为get)seekp(...省略参数) (p 为put) tellg(void) ,tellp(void);
对于读文件 使用seekg() 或者 tellg() (省略了参数)
对于写文件 使用seekp() 或者 tellp() (省略了参数)
tellg() 和 tellp() 返回当前流位置;
seekg() 和 seekp() 函数用于设置流位置,C++提供两种版本
1.只有一个参数 seekg( pos) (用于绝对定位):
seekg(16) 移动到流中位置16上 ,注意流位置从0开始;
2.含有两个参数(用于相对定位):
例如:seekg( -2,ios::end) ,seekg( 4,ios::beg) ,第一个参数是 相对偏移量,ios::end 和 ios::beg 为流常量 分别意为 流结尾 和 流开头 。
-2 (向前移动2个单位),4( 向后移动4个单位)。
seekp() , tellp() 有相同用法 这里不再累述。