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

C++使用fstream无法为输出打开临时文件及FILE*赋值问题咨询

问题解决方案:C++临时文件读写转换为数组

标准C++的std::ifstream无接收FILE*类型的构造函数,因此直接赋值属于语法错误,以下提供3种可行实现方案:

方案1:内存流实现(最优,无磁盘IO)

如果你的需求只是临时存储数据后读取,不需要将内容持久化到磁盘,直接使用std::stringstream内存流即可,完全规避文件操作的适配问题:

#include <iostream>
#include <sstream>
#include <vector>

int main()
{
    std::stringstream temp;
    // 写入数据
    temp << "5\n1 2 3 4 5";
    // 读取数据存入数组
    int size;
    temp >> size;
    std::vector<int> myVar(size);
    for (int i = 0; i < size; ++i) {
        temp >> myVar[i];
    }
    // 遍历输出
    for (int i : myVar)
        std::cout << i << " ";
    return 0;
}

方案2:全C++标准库文件流实现(跨平台,需磁盘存储)

如果必须生成磁盘临时文件,完全使用C++的文件流接口实现,避免混用C的FILE*类型:

#include <iostream>
#include <fstream>
#include <vector>
#include <filesystem> // C++17及以上支持

int main()
{
    // 生成临时文件路径
    auto temp_path = std::filesystem::temp_directory_path() / "temp_data_xxxxxx";
    // 打开临时文件同时支持读写
    std::fstream file(temp_path, std::ios::in | std::ios::out | std::ios::trunc);
    
    // 写入数据
    file << "5\n1 2 3 4 5";
    // 移动文件指针到开头,准备读取
    file.seekg(0);
    
    // 读取数据存入数组
    int size;
    file >> size;
    std::vector<int> myVar(size);
    for (int i = 0; i < size; ++i) {
        file >> myVar[i];
    }
    
    // 遍历输出
    for (int i : myVar)
        std::cout << i << " ";
    
    // 程序结束前删除临时文件
    std::filesystem::remove(temp_path);
    return 0;
}

如果使用低于C++17的标准,可以替换为tmpnam()函数生成临时文件名,注意该函数存在线程安全风险,单线程场景可正常使用。

方案3:混用C的FILE*与C++流(平台相关,不推荐)

如果必须保留原有tmpfile()的调用逻辑,可以使用编译器扩展实现类型适配,GCC/Clang环境下示例如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <ext/stdio_filebuf.h> // GCC/Clang专属扩展头文件

int main()
{
    FILE* temp = tmpfile();
    std::fputs("5\n1 2 3 4 5", temp);
    // 移动文件指针到开头
    rewind(temp);
    
    // 用扩展类封装FILE*
    __gnu_cxx::stdio_filebuf<char> filebuf(temp, std::ios::in);
    std::istream file(&filebuf);
    
    // 读取数据存入数组
    int size;
    file >> size;
    std::vector<int> myVar(size);
    for (int i = 0; i < size; ++i) {
        file >> myVar[i];
    }
    
    // 遍历输出
    for (int i : myVar)
        std::cout << i << " ";
    
    fclose(temp);
    return 0;
}

注意该方案依赖编译器扩展,无法在MSVC等其他编译环境下直接运行。


注意事项

  • 所有文件/流写入操作完成后,必须将读写指针移动到开头才能正常读取内容,否则会直接读到文件结束标识
  • 磁盘临时文件使用完成后要主动删除,避免占用磁盘空间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:09:02