【杂谈】坑爹的 fstream open mode 细节问题
最近在做数据结构的大作业,要写个简单的数据库,因此和 fstream 打交道略多。
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开
ios:out: 文件以输出方式打开
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
以上是网络上都能找到的一些解释,但在使用过程中有些迷之问题。
1. ios::in | ios::out 在文件不存在的时候是不会创建新文件的,必须用个 ios::in | ios::out | ios::app
2. ios::app 无法seek到文件长度以外的地方 put('\0') 写一串空字符,根据网上有人说 ios::app 后就只能在文件后写,无法seek,有待验证,之后试验后补充
临时解决办法是 先用ios::app 在不存在的时候创建,再关闭,然后不用 ios::app 打开进行扩展空间