You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将stringstream写入ofstream?代码无输出问题求助

问题原因

当你调用cout << stream.rdbuf()时,rdbuf()会将std::stringstream的读位置指针移动到流的末尾,同时触发EOF标志。后续再用p << stream.rdbuf()写入文件时,流已经处于无内容可读的状态,自然无法写入任何数据。

解决方案

提供两种可行的修复方式:

方式1:重置流的读指针与状态

在写入文件前,将流的读指针重置到起始位置,并清除EOF标志:

int main() {
    std::stringstream stream;
    stream << "Hello world";
    cout << stream.rdbuf() << endl; // 正常输出

    // 重置读指针到流开头,清除EOF状态
    stream.seekg(0);
    stream.clear();

    std::ofstream p{ "hi.txt" };
    p << stream.rdbuf(); // 现在可正常写入内容
    p.close();
    
    std::ifstream ip{ "hi.txt" };
    std::string s;
    ip >> s;
    cout << s; // 输出 Hello
    ip.close(); // 原代码错误关闭了p,此处应关闭读取流ip
    return 0;
}

方式2:直接获取字符串内容操作

通过str()方法获取std::stringstream的完整内容,避免操作流指针导致的问题:

int main() {
    std::stringstream stream;
    stream << "Hello world";
    cout << stream.str() << endl; // 用str()获取内容,不影响流状态

    std::ofstream p{ "hi.txt" };
    p << stream.str(); // 直接写入字符串内容
    p.close();
    
    std::ifstream ip{ "hi.txt" };
    std::string s;
    ip >> s;
    cout << s;
    ip.close();
    return 0;
}

内容的提问来源于stack exchange,提问作者lorem1213

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:00:59