如何同时将内容写入文件与std::string变量?技术求助
解决方案:同时写入文件并捕获内容到std::string
嘿,这个需求其实很好解决,我给你两个实用的方案,既能保留原有的文件写入逻辑,又能把内容同步捕获到std::string里~
方案一:自定义分流缓冲区(实时双输出)
这个方案适合需要实时同时输出到文件和字符串的场景,比如处理大体积JSON内容时,避免一次性把所有内容存在内存里。我们可以自定义一个streambuf,让它把输出同时转发给文件流和字符串流:
#include <fstream> #include <sstream> #include <streambuf> // 自定义分流缓冲区,同时输出到两个streambuf class TeeBuf : public std::streambuf { public: TeeBuf(std::streambuf* fileBuf, std::streambuf* stringBuf) : fileBuf_(fileBuf), stringBuf_(stringBuf) {} protected: // 处理单个字符输出 int overflow(int c) override { if (c != EOF) { // 同时写入文件缓冲区和字符串缓冲区 auto res1 = fileBuf_->sputc(c); auto res2 = stringBuf_->sputc(c); return (res1 == EOF || res2 == EOF) ? EOF : c; } return c; } // 同步缓冲区 int sync() override { auto res1 = fileBuf_->pubsync(); auto res2 = stringBuf_->pubsync(); return (res1 == 0 && res2 == 0) ? 0 : -1; } private: std::streambuf* fileBuf_; std::streambuf* stringBuf_; };
使用方式
首先修改你的func函数,把参数从std::ofstream改成std::ostream&(这样通用性更强,原有的文件流调用完全兼容):
#include <ostream> // 假设JsonData是你的自定义JSON数据类型 void func(std::ostream& outputStream, const JsonData& jsonData) { // 这里放你原来的JSON解析和写入逻辑,比如: outputStream << "解析后的内容:" << jsonData.someKey << "\n"; // ...其他写入操作 }
然后在主逻辑里使用分流缓冲区:
int main() { // 打开文件流 std::ofstream fileStream("output.txt"); // 创建字符串流用于捕获内容 std::stringstream contentStream; // 初始化分流缓冲区,关联文件流和字符串流的缓冲区 TeeBuf teeBuf(fileStream.rdbuf(), contentStream.rdbuf()); // 基于分流缓冲区创建ostream std::ostream teeStream(&teeBuf); // 准备你的JSON数据 JsonData jsonData; // ...初始化jsonData // 调用func,此时内容会同时写入文件和字符串流 func(teeStream, jsonData); // 从字符串流获取内容到aa std::string aa = contentStream.str(); // 关闭文件流 fileStream.close(); return 0; }
方案二:先写入字符串流,再复制到文件
如果你的JSON内容体积不大,这个方案更简单直接——先把内容输出到字符串流,再把字符串流的内容同时写入文件和赋值给aa:
修改后的func函数(同样建议改成std::ostream&)
void func(std::ostream& outputStream, const JsonData& jsonData) { // 原有的解析和写入逻辑不变 }
主逻辑实现
int main() { std::stringstream contentStream; JsonData jsonData; // ...初始化jsonData // 先把内容写入字符串流 func(contentStream, jsonData); // 获取内容到aa std::string aa = contentStream.str(); // 把内容写入文件 std::ofstream fileStream("output.txt"); fileStream << contentStream.str(); fileStream.close(); return 0; }
这个方案的优点是代码更简洁,不需要自定义缓冲区,缺点是所有内容都会先存在内存里,适合处理小到中等体积的JSON数据。
内容的提问来源于stack exchange,提问作者Humble_Aspirant
相关产品推荐
相关产品推荐

