写文件有三种模式:

  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::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++ 覆盖写文件的更多相关文章

  1. shell脚本实现覆盖写文件和追加写文件

    1.覆盖写文件 ">" date  > not_append_file.txt

  2. java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结

    代码如下: import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; public ...

  3. PHP写文件函数

    /** * 写文件函数 * * @param string $filename 文件名 * @param string $text 要写入的文本字符串 * @param string $openmod ...

  4. java写文件

                                  randomAccessFile.close();              }                  e.printStack ...

  5. vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件

    ---恢复内容开始--- 在xshell里写代码,如果需要编辑代码,可以输入  vim+ xxx.py  ,进入vim编辑界面 这里的xxx.py表示  python的存储文件,后缀名是.py. 1. ...

  6. CStdioFile 写文件

    前言: 介绍如何使用 CStdioFile 类去写文件. 完整工程代码,点我下载(请注意工程里面需要包含的 <locale.h>头文件 ) 示例: /// My Add // 获取当前路径 ...

  7. linux下移动或者复制文件覆盖相同文件夹时,文件夹里面的每个文件都提示是否覆盖

    链接地址:http://blog.chinaunix.net/uid-23683795-id-2391087.html # vi ~/.bashrc   如果你看到如下内容,以下命令都会用别名执行了, ...

  8. Golang覆盖写入文件的小坑

    记录一点Golang文件操作的笔记,环境:Ubuntu // 删除文件 func removeFile() { err := os.Remove("test.txt") if er ...

  9. Python: 读文件,写文件

    读写文件是最常见的IO操作.Python内置了读写文件的函数. 读写文件前,我们先了解一下,在磁盘上读写文件的功能都是有操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求 ...

  10. FileWriter 写文件

    FileWriter fw = new FileWriter("C://Users//pc//Desktop//aaa.txt",true); fw.write("201 ...

随机推荐

  1. 基于一维卷积神经网络模型的AI量化智能选股策略

    这是早前BigQuant专题研究:基于卷积神经网络CNN的深度学习因子选股模型.卷积神经网络(Convolutional Neural Network, CNN),是计算机视觉研究和应用领域中最具影响 ...

  2. 如何保障Cookie的信息安全

    一.支持策略 保障 Cookie 的安全性可以从以下几个方面进行: 使用 HttpOnly 属性:设置 HttpOnly 属性可以防止JavaScript Document.cookie API 无法 ...

  3. BUUCTF-Crypto详细Writeup

    每一天都要努力啊    ----2024-01-01 18:11:36 1.一眼就解密 原题:下面的字符串解密后便能获得flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUkl ...

  4. Python——Html(表格<table>, <tr>,<td>,<th>、表单<form>、自定义标签<div>和<span>)

    一.表格<table>, <tr>,<td>或<th> <table> 元素是 HTML 中用于创建表格的主要标记.表格是一种用于展示数据的 ...

  5. Netty 组件介绍

    BootStrap Netty 中的 BootStrap 分为两种:一种是客户端的 BootStrap:一种是服务端的 ServerBootStrap. 客户端的 BootStrap 初始化客户端,该 ...

  6. Rasa初始化聊天机器人的配置

      本文详细介绍了使用 rasa init 初始化聊天机器人项目的配置,包括 nlu.yml.rules.yml.stories.yml.test_stories.yml.config.yml.cre ...

  7. flink 笔记

    flink 分区实现 http://smartsi.club/physical-partitioning-in-apache-flink.html

  8. 关于echarts+vue频繁刷新的造成的内存增长问题

    前言 关于解决echarts+ws多次数据刷新渲染,内存增长溢出的尝试. 记录一下,便于下次使用有参考 方法 关闭echarts动画 tooltip的动画设置为false.(echarts动画会缓存, ...

  9. 在线编辑Excel——插入图表

    本文内容介绍如何通过Excel在线编辑器--Spire.Cloud Excel来实现图表插入,插入图表时,可插入常见的柱状图.饼图.折线图.条形图.面积图.散点图.股价图等.这里挑选几种图表来展示插入 ...

  10. C++篇:第一章_变量和常量_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 注意:C++篇为本人手动将Word文档修改成Markdown格式(因为网上修改的 ...