c++怎么将JSON字符串保存为文件_ofstream与字符串转义【详解】

冬辰姑娘_1003

冬辰姑娘_1003

2026-03-25

887人浏览

原创

应使用二进制模式写入UTF-8编码的JSON字符串:以std::ios::binary打开文件,用write()写入原始字节流,避免文本模式下的编码转换与转义干扰。

c++怎么将json字符串保存为文件_ofstream与字符串转义【详解】

JSON字符串写入文件时中文乱码或转义错误

直接用 std::ofstream 写入含中文或特殊字符的 JSON 字符串,大概率出现乱码、双引号消失、反斜杠被吃掉——根本原因不是 JSON 本身有问题,而是 ofstream 默认按系统本地编码(如 GBK)写入,而 JSON 字符串通常是 UTF-8 编码,且内部已包含转义(如 "\u4f60" 或 "\"")。

实操建议:

  • 确认你的 JSON 字符串确实是合法 UTF-8 编码(比如来自 nlohmann::json::dump() 或 rapidjson::StringBuffer 输出)
  • 不要手动对字符串再做一次 std::string 层面的转义(例如把 " 替换成 "),JSON 库输出的字符串已经是可直接写入的原始字节流
  • Windows 下需显式设置文件流为 UTF-8 模式:调用 myfile.imbue(std::locale("", std::locale::ctype)) 不可靠;更稳妥的是用 _setmode(_fileno(stdout), _O_U16TEXT) 类思路不适用文件流——干脆绕过,改用二进制模式写入

用 std::ofstream 以二进制模式保存 JSON 字符串

这是最简单、兼容性最好的做法:跳过所有文本编码转换逻辑,把 JSON 字符串当纯字节序列写进去。UTF-8 本身就是字节安全的,只要字符串内容没错,文件就没错。

实操建议:

  • 打开文件时加 std::ios::binary 标志:std::ofstream file("data.json", std::ios::out | std::ios::binary)
  • 写入时用 file.write(str.data(), str.size()),别用 流插入操作符(它会触发格式化和换行处理)
  • 确保 str 是 std::string(而非 std::wstring),且内容为 UTF-8 字节
  • 写完记得 file.close() 或让对象析构,避免缓冲区未刷新

示例片段:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
std::string json_str = R"({"name":"张三","score":95.5})";
std::ofstream f("output.json", std::ios::out | std::ios::binary);
if (f.is_open()) {
    f.write(json_str.data(), json_str.size());
    f.close();
}

JSON 库输出与手动拼接字符串的转义差异

很多人试图自己用 std::string 拼接 JSON,比如 "{"name":"" + name + ""}",这极易出错:漏转义引号、斜杠、控制字符,或重复转义(如把 " " 变成 "\n")。而正规 JSON 库(如 nlohmann::json)的 dump() 方法会严格按 RFC 8259 处理所有字符。

实操建议:

  • 永远优先用 JSON 库生成字符串,而不是手写或正则替换
  • nlohmann::json::dump() 默认不缩进、不转义非 ASCII 字符(即保留中文原文),若需 Unicode 转义("\u4f60"),传参 json.dump(-1, ' ', false, nlohmann::json::error_handler_t::strict) 不起作用;正确方式是设 json.dump(0, ' ', true) —— 第三个参数为 true 表示 escape_unicode
  • 如果用 rapidjson,StringBuffer + Writer 默认输出 UTF-8 原始字节,无需额外处理

跨平台文件路径与权限问题(尤其 Windows)

写 JSON 文件失败,有时根本不是编码问题,而是路径非法或无写入权限。比如在 Windows 上尝试写入 C:config.json(需要管理员权限),或路径含 *? 等非法字符。

实操建议:

  • 路径用正斜杠 / 或双反斜杠 \,避免单个 被当转义(如 "C: empdata.json" 中的 会被解释为制表符)
  • 写入前检查目录是否存在:std::filesystem::create_directories()(C++17)比手动 mkdir 更可靠
  • 打开文件后务必检查 file.is_open(),否则 write() 会静默失败
  • Linux/macOS 下注意目标目录是否只读,或磁盘满;Windows 下注意杀毒软件可能临时锁定文件

写文件这件事,真正卡住人的往往不是 JSON 格式本身,而是“以为字符串能直接塞进去”和“没意识到流对象在后台偷偷做了编码转换”。二进制模式写入+库生成字符串,是最少意外的组合。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ stream

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2175

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3422

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1156

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3919

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6679

3

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1798

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2824

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6164

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

5909

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习