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

C++ 覆盖写文件

2022-05-05 12:02 393 查看 https://www.cnblogs.com/mkckr0

写文件有三种模式:

  1. 截断写,文件打开之后立即清空原有内容
  2. 附加写,文件打开之后不清空原有内容,每次只能在文件最后写入
  3. 覆盖写,文件打开之后不清空原有内容,可以在文件任意位置写入

例如:文件原有内容为

123456
,在开始位置覆盖写入
abcd
,最后文件内容为
abcd56
。首先使用下面的代码进行尝试:

#include <fstream>

int main()
{
std::ofstream ofile("test.txt");
ofile << "abcd";
}

输出的结果为

abcd
,原有内容被截断了。可是并没有设置
std::ios::trunc
标志。
ofstream
默认只设置了
std::ios::out
。查阅 std::basic_filebuf<CharT,Traits>::open 发现单独的
std::ios::out
std::ios::out | std::ios::trunc
等价。想要在不设置
std::ios::trunc
std::ios::app
的情况下设置
std::ios::out
,只能使用
std::ios::in | std::ios::out
。因此修改代码为:

#include <fstream>

int main()
{
std::ofstream ofile("test.txt", std::ios::in);
ofile << "abcd";
}

成功输出

abcd56
。覆盖写并没有被 C/C++ 标准直接支持,因此只能借助这种奇怪的组合实现。在底层的 Linux 有更直接的办法:

#include <fcntl.h>
#include <unistd.h>

int main()
{
int fd = open("test.txt", O_WRONLY);
write(fd, "abcd", 4);
close(fd);
}

这段代码只用了简单的

O_WRONLY
标志,就实现了覆盖写。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: