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
相关产品推荐
相关产品推荐

