码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ 创建文件并写入内容


    文章目录

    • 1.问题
    • 2.filesystem
    • 3.示例
    • 参考文献

    1.问题

    C++ 如何向指定路径的文件写入内容呢?

    这里有几点要求:

    1. 如果目录不存在需要自动创建。
    2. 如果文件不存在需要自动创建。
    3. 以覆盖的方式写入内容。

    2.filesystem

    C++17 带来了一个新的库:filesystem。

    filesystem 是一个文件系统库,前身是 boost.filesystem,用于实现跨平台的文件处理。

    文件系统库 filesystem 定义在头文件,命名空间为 std::filesystem。

    以下是常用类:

    1. path 类:该类表示一个路径,对字符串(路径)进行一些处理,如路径拼接、分解、获取文件名等操作。
    2. directory_entry 类:功如其名,目录条目,这个类才真正接触文件。
    3. directory_iterator 类:获取文件系统目录中文件的迭代器容器,其元素为 directory_entry 对象,可用于遍历目录。
    4. recursive_directory_iterator 类:与 directory_iterator 类似,但它可以递归遍历目录及其子目录中的条目。
    5. file_status 类:用于获取和修改文件(或目录)的属性。
    6. filesystem_error 类:用于处理文件系统操作中的异常情况的异常类。
    7. file_type 类:表示文件的类型,包括正常文件、目录、符号链接等。它通常与std::filesystem::status()函数一起使用来获取文件的类型。

    此外,还有 space_info、perms、perm_options 等类的说明,可在 cppreference.com 查看。

    3.示例

    下面演示利用 filesystem 实现自动创建目录与文件,并覆盖写入。

    #include 
    #include 
    #include 
    
    // 将内容以覆盖的方式写入文件,如果文件不存在,则自动创建。
    void flushResult(const std::string filepath, const std::string data) {
        // 获取文件所在目录的路径。
        std::filesystem::path dirPath = std::filesystem::path(filepath).parent_path();
    
        // 创建目录(如果目录不存在)。
        if (!dirPath.empty()) {
        	if (!std::filesystem::exists(dirPath)) {
            	std::filesystem::create_directories(dirPath);
        	}
        }
    
        // 打开文件,如果文件不存在则创建。
        std::ofstream outputFile(filepath, std::ios::out | std::ios::trunc);
        outputFile << data;
        outputFile.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在创建目录前需要判断目录 path 是否为空:

    path::empty() // 检查路径是否为空
    
    • 1

    如果传入的文件路径只包含文件名,那么调用 filesystem::create_directories 传入空的目录 path 将引发异常。

    下面在 Windows 环境测试一下。

    int main() {
    	flushResult(".\\dir1\\dir2\\lvlv.json", "{\"hell\":\"world\"}");
    }
    
    • 1
    • 2
    • 3

    注意,Windows 目录中的反斜杠需要转义,JOSN 中的双引号也需要转义。或者使用 C++11 原生字符串。

    int main() {
        flushResult(R"(.\dir1\dir2\lvlv.json)", R"({"hell":"world"})");
    }
    
    • 1
    • 2
    • 3

    编译运行上面的 main() 函数,将在当前工作目录下创建.\dir1\di2\lvlv.json文件并写入{"hell":"world"}。


    参考文献

    Filesystem library (since C++17) - cppreference.com

  • 相关阅读:
    PIE-engine 教程 ——随机森林监督分类案例(河北安国市为例)
    【蓝桥杯选拔赛真题33】python回文数升级 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
    哈希传递原理
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的移动端农副产品销售平台实现的App[包运行成功]计算机毕业设计安卓项目源码
    FPGA coaxpress 2.0 ip
    西电计科院微机原理与系统设计课程笔记(车向泉版)
    面试题: 谈一谈对 ThreadLocal 的理解
    压测工具Jmeter介绍及使用
    StarRocks 自增ID实现分页优化
    Spring-Boot (二) application.properties配置文件内容
  • 原文地址:https://blog.csdn.net/K346K346/article/details/133198908
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号