C++ 覆盖或删除指定位置的文件内容

1.覆盖指定位置的文件内容

我们经常使用 ofstream 或者 fstream 可写文件,使用 ifstream 可以写文件,但需要设置文件的打开状态为 ios::out。C++ 中 IO 流打开模式使用位掩码来表示。IO 流打开模式有:

成员常量
app append,追加模式,设置流指针在每一个操作前均指向文件流末尾
ate at end,设置流指针在打开时指向文件流末尾
binary 以二进制模式开打文件流
in input,输入模式,允许读取文件流
out output,输出模式,允许写入文件流
trunc truncate,截断模式,打开文件流时清空所有内容

些常数在 ios_base 类定义为 public 成员。因此,可以直接以类名字加作用域运算符访问(如ios_base::out),或使用ios_base的任何继承类或实例化的对象,例如 ios::out 或 cout.out。

ofstream 在打开文件时默认清空文件所有内容。如果使用 ios::app 来打开文件,虽然不会清空文件内容,但是每次写操作都追加到文件末尾。

int main()
{
   fstream fout;
   fout.open("hello.txt",fstream::binary | fstream::out | fstream::app);
   pos=fout.tellp();
   fout.seekp(-5,ios::end);
   fout.write("####",4);
   fout.close();
   return 0;
}

上面的操作虽然使用了文件指针偏移操作fout.seekp(-5,ios::end);,但是每次写入还是追加到文件末尾,解决办法使用文件打开模式 ios::in,这样可以保证文件内容不会被清空,且文件指针偏移操作有效。

fout.open("hello.txt",fstream::binary | fstream::out | fstream::in);

//或
fstream fout("hello.txt",fstream::binary | fstream::out | fstream::in);

2.删除指定位置的文件内容

很遗憾,C++ 的文件流并没有提供这样的功能,我们只能先读取保留的内容,再以截断模式写回原文件[3]^{[3]}


参考文献

[1] C++ overwriting data in a file at a particular position
[2] std::ios_base::openmode
[3] stackoverflow.overwriting some text in a file using fstream and delete the rest of the file

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值