C++ 覆盖写文件

本文介绍了C++中实现文件覆盖写入的方法,包括不同写入模式的解释,如截断写、附加写和覆盖写。通过示例代码展示了如何在不使用 std::ios::trunc 或 std::ios::app 标志的情况下,利用 std::ios::in | std::ios::out 实现覆盖写操作。同时提到了C语言中 r+ 模式和Linux系统下直接使用 O_WRONLY 标志的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写文件有三种模式:

截断写,文件打开之后立即清空原有内容
附加写,文件打开之后不清空原有内容,每次只能在文件最后写入
覆盖写,文件打开之后不清空原有内容,可以在文件任意位置写入
例如:文件原有内容为 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::outstd::ios::out | std::ios::trunc 等价。想要在不设置 std::ios::truncstd::ios::app 的情况下设置 std::ios::out,只能使用 std::ios::in | std::ios::out。因此修改代码为:

#include <fstream>

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

成功输出 abcd56。覆盖写并没有被 C/C++ 标准直接支持,因此只能借助这种奇怪的组合实现。下面的写法也与其等价:

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

std::ios::in | std::ios::out 和 C 语言的 r+ 等价,所有也可以这样写:

FILE* ofile = fopen("test.txt", "r+");
fprintf(ofile, "abcd");

在底层的 Linux 有更直接的办法:

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

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

这段代码只用了简单的 O_WRONLY 标志,就实现了覆盖写。

原文链接

C++ 覆盖写文件-QT开发中文网C++ 覆盖写文件https://qt.0voice.com/?id=788

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值